示例#1
0
        private unsafe string Convert(double d)
        {
            var buffer = stackalloc char[24];
            var len    = FastDtoa.Convert(d, buffer);

            return(new string(buffer, 0, len));
        }
示例#2
0
        public static string ToNumberString(double m)
        {
            if (double.IsNaN(m))
            {
                return("NaN");
            }

            if (m.Equals(0))
            {
                return("0");
            }

            if (double.IsPositiveInfinity(m) || m >= double.MaxValue)
            {
                return("Infinity");
            }

            if (m < 0)
            {
                return("-" + ToNumberString(-m));
            }

            // V8 FastDtoa can't convert all numbers, so try it first but
            // fall back to old DToA in case it fails
            var result = FastDtoa.NumberToString(m);

            if (result != null)
            {
                return(result);
            }

            // s is all digits (significand)
            // k number of digits of s
            // n total of digits in fraction s*10^n-k=m
            // 123.4 s=1234, k=4, n=3
            // 1234000 s = 1234, k=4, n=7
            string s       = null;
            var    rFormat = m.ToString("r");

            if (rFormat.IndexOf("e", StringComparison.OrdinalIgnoreCase) == -1)
            {
                s = rFormat.Replace(".", "").TrimStart('0').TrimEnd('0');
            }

            const string format = "0.00000000000000000e0";
            var          parts  = m.ToString(format, CultureInfo.InvariantCulture).Split('e');

            if (s == null)
            {
                s = parts[0].TrimEnd('0').Replace(".", "");
            }

            var n = int.Parse(parts[1]) + 1;
            var k = s.Length;

            if (k <= n && n <= 21)
            {
                return(s + new string('0', n - k));
            }

            if (0 < n && n <= 21)
            {
                return(s.Substring(0, n) + '.' + s.Substring(n));
            }

            if (-6 < n && n <= 0)
            {
                return("0." + new string('0', -n) + s);
            }

            if (k == 1)
            {
                return(s + "e" + (n - 1 < 0 ? "-" : "+") + System.Math.Abs(n - 1));
            }

            return(s.Substring(0, 1) + "." + s.Substring(1) + "e" + (n - 1 < 0 ? "-" : "+") + System.Math.Abs(n - 1));
        }