private unsafe string Convert(double d) { var buffer = stackalloc char[24]; var len = FastDtoa.Convert(d, buffer); return(new string(buffer, 0, len)); }
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)); }