1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #nullable disable
- using System.Diagnostics;
- using Jint.Runtime;
- namespace Jint.Native.Number.Dtoa
- {
- internal static class DtoaNumberFormatter
- {
- public static void DoubleToAscii(
- ref DtoaBuilder buffer,
- double v,
- DtoaMode mode,
- int requested_digits,
- out bool negative,
- out int point)
- {
- Debug.Assert(!double.IsNaN(v));
- Debug.Assert(!double.IsInfinity(v));
- Debug.Assert(mode == DtoaMode.Shortest || requested_digits >= 0);
- point = 0;
- negative = false;
- buffer.Reset();
- if (v < 0)
- {
- negative = true;
- v = -v;
- }
- if (v == 0)
- {
- buffer[0] = '0';
- point = 1;
- return;
- }
- if (mode == DtoaMode.Precision && requested_digits == 0)
- {
- return;
- }
- bool fast_worked = false;
- switch (mode) {
- case DtoaMode.Shortest:
- fast_worked = FastDtoa.NumberToString(v, DtoaMode.Shortest, 0, out point, ref buffer);
- break;
- case DtoaMode.Fixed:
- //fast_worked = FastFixedDtoa(v, requested_digits, buffer, length, point);
- ExceptionHelper.ThrowNotImplementedException();
- break;
- case DtoaMode.Precision:
- fast_worked = FastDtoa.NumberToString(v, DtoaMode.Precision, requested_digits, out point, ref buffer);
- break;
- default:
- ExceptionHelper.ThrowArgumentOutOfRangeException();
- return;
- }
- if (fast_worked)
- {
- return;
- }
- // If the fast dtoa didn't succeed use the slower bignum version.
- buffer.Reset();
- BignumDtoa.NumberToString(v, mode, requested_digits, ref buffer, out point);
- }
- }
- }
|