DtoaNumberFormatter.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. case DtoaMode.Shortest:
  39. fast_worked = FastDtoa.NumberToString(v, DtoaMode.Shortest, 0, out point, ref buffer);
  40. break;
  41. case DtoaMode.Fixed:
  42. //fast_worked = FastFixedDtoa(v, requested_digits, buffer, length, point);
  43. ExceptionHelper.ThrowNotImplementedException();
  44. break;
  45. case DtoaMode.Precision:
  46. fast_worked = FastDtoa.NumberToString(v, DtoaMode.Precision, requested_digits, out point, ref buffer);
  47. break;
  48. default:
  49. ExceptionHelper.ThrowArgumentOutOfRangeException();
  50. return;
  51. }
  52. if (fast_worked)
  53. {
  54. return;
  55. }
  56. // If the fast dtoa didn't succeed use the slower bignum version.
  57. buffer.Reset();
  58. BignumDtoa.NumberToString(v, mode, requested_digits, ref buffer, out point);
  59. }
  60. }