DtoaNumberFormatter.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #nullable disable
  2. using System.Diagnostics;
  3. using Jint.Runtime;
  4. namespace Jint.Native.Number.Dtoa;
  5. internal static class DtoaNumberFormatter
  6. {
  7. public static void DoubleToAscii(
  8. ref DtoaBuilder buffer,
  9. double v,
  10. DtoaMode mode,
  11. int requested_digits,
  12. out bool negative,
  13. out int point)
  14. {
  15. Debug.Assert(!double.IsNaN(v));
  16. Debug.Assert(!double.IsInfinity(v));
  17. Debug.Assert(mode == DtoaMode.Shortest || requested_digits >= 0);
  18. point = 0;
  19. negative = false;
  20. buffer.Reset();
  21. if (v < 0)
  22. {
  23. negative = true;
  24. v = -v;
  25. }
  26. if (v == 0)
  27. {
  28. buffer[0] = '0';
  29. point = 1;
  30. return;
  31. }
  32. if (mode == DtoaMode.Precision && requested_digits == 0)
  33. {
  34. return;
  35. }
  36. bool fast_worked = false;
  37. switch (mode)
  38. {
  39. case DtoaMode.Shortest:
  40. fast_worked = FastDtoa.NumberToString(v, DtoaMode.Shortest, 0, out point, ref buffer);
  41. break;
  42. case DtoaMode.Fixed:
  43. //fast_worked = FastFixedDtoa(v, requested_digits, buffer, length, point);
  44. Throw.NotImplementedException();
  45. break;
  46. case DtoaMode.Precision:
  47. fast_worked = FastDtoa.NumberToString(v, DtoaMode.Precision, requested_digits, out point, ref buffer);
  48. break;
  49. default:
  50. Throw.ArgumentOutOfRangeException();
  51. return;
  52. }
  53. if (fast_worked)
  54. {
  55. return;
  56. }
  57. // If the fast dtoa didn't succeed use the slower bignum version.
  58. buffer.Reset();
  59. BignumDtoa.NumberToString(v, mode, requested_digits, ref buffer, out point);
  60. }
  61. }