DtoaNumberFormatter.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #nullable disable
  2. using System.Diagnostics;
  3. using Jint.Runtime;
  4. namespace Jint.Native.Number.Dtoa
  5. {
  6. internal static class DtoaNumberFormatter
  7. {
  8. public static void DoubleToAscii(
  9. ref DtoaBuilder buffer,
  10. double v,
  11. DtoaMode mode,
  12. int requested_digits,
  13. out bool negative,
  14. out int point)
  15. {
  16. Debug.Assert(!double.IsNaN(v));
  17. Debug.Assert(!double.IsInfinity(v));
  18. Debug.Assert(mode == DtoaMode.Shortest || requested_digits >= 0);
  19. point = 0;
  20. negative = false;
  21. buffer.Reset();
  22. if (v < 0)
  23. {
  24. negative = true;
  25. v = -v;
  26. }
  27. if (v == 0)
  28. {
  29. buffer[0] = '0';
  30. point = 1;
  31. return;
  32. }
  33. if (mode == DtoaMode.Precision && requested_digits == 0)
  34. {
  35. return;
  36. }
  37. bool fast_worked = false;
  38. switch (mode) {
  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. ExceptionHelper.ThrowNotImplementedException();
  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. ExceptionHelper.ThrowArgumentOutOfRangeException();
  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. }
  62. }