29 private static readonly uint[]
s_uint32PowersOfTen =
new uint[10] { 1u, 10u, 100u, 1000u, 10000u, 100000u, 1000000u, 10000000u, 100000000u, 1000000000u };
33 if (((uint)style & 0xFFFFFC00u) != 0)
38 if ((style &
NumberStyles.AllowHexSpecifier) != 0 && ((uint)style & 0xFFFFFDFCu) != 0)
100 if (number.digits ==
null || number.digits.Length == 0)
105 int a = number.digits.Length - 1;
119 uint num3 = ((flag && num2 > 0) ? uint.MaxValue : 0u);
130 for (
int i = 0; i < span3.
Length; i++)
138 num3 = (num3 << 4) | (uint)num5;
149 span2 = span2.TrimEnd(0u);
157 else if (span2.
Length == 1)
159 num6 = (int)span2[0];
161 if ((!flag && num6 < 0) || num6 ==
int.MinValue)
163 array2 =
new uint[1] { (uint)num6 };
164 num6 = ((!flag) ? 1 : (-1));
169 num6 = ((!flag) ? 1 : (-1));
192 int currentBufferSize = 0;
193 int[] arrayFromPool =
null;
194 uint partialValue = 0u;
195 int partialDigitCount = 0;
196 int totalDigitCount = 0;
197 int numberScale = number.scale;
203 if (!ProcessChunk(enumerator.
Current.
Span, ref currentBuffer2))
209 if (partialDigitCount > 0)
214 for (num = numberScale - totalDigitCount; num >= 9; num -= 9)
216 MultiplyAdd(ref currentBuffer2, 1000000000u, 0u);
224 if (currentBufferSize == 0)
229 else if (currentBufferSize == 1 && currentBuffer2[0] <=
int.MaxValue)
231 n = (int)(number.sign ? (0
L - (
long)currentBuffer2[0]) : currentBuffer2[0]);
236 n = ((!number.sign) ? 1 : (-1));
237 rgu = currentBuffer2.
Slice(0, currentBufferSize).ToArray();
244 if (arrayFromPool !=
null)
249 void MultiplyAdd(ref
Span<uint> currentBuffer, uint multiplier, uint addValue)
252 uint num2 = addValue;
253 for (
int i = 0; i < span2.
Length; i++)
255 ulong num3 = (ulong)((
long)multiplier * (long)span2[i] + num2);
256 span2[i] = (uint)num3;
257 num2 = (uint)(num3 >> 32);
261 if (currentBufferSize == currentBuffer.Length)
263 int[]
array = arrayFromPool;
266 currentBuffer.CopyTo(span3);
267 currentBuffer = span3;
273 currentBuffer[currentBufferSize] = num2;
279 int val =
Math.
Max(numberScale - totalDigitCount, 0);
282 uint num4 = partialValue;
283 int num5 = partialDigitCount;
284 int num6 = totalDigitCount;
285 for (
int j = 0; j < readOnlySpan.
Length; j++)
287 char c = chunkDigits[j];
293 num4 = num4 * 10 + (uint)(c - 48);
298 MultiplyAdd(ref currentBuffer, 1000000000u, num4);
306 for (
int k = 0; k < readOnlySpan2.
Length; k++)
308 switch (readOnlySpan2[k])
321 partialDigitCount = num5;
322 totalDigitCount = num6;
336 if ((c >=
'A' && c <=
'Z') || (c >=
'a' && c <=
'z'))
342 num2 =
format[num++] - 48;
345 int num3 = num2 * 10 + (
format[num++] - 48);
365 Span<byte> destination2 = stackalloc
byte[64];
366 if (!
value.TryWriteOrCountBytes(destination2, out var bytesWritten))
369 bool flag =
value.TryWriteBytes(destination2, out bytesWritten);
371 destination2 = destination2.
Slice(0, bytesWritten);
372 Span<char> initialBuffer = stackalloc
char[128];
374 int num = destination2.Length - 1;
378 byte b = destination2[num];
386 valueStringBuilder.
Append((b < 10) ? ((char)(b + 48)) : ((
format ==
'X') ? ((
char)((b & 0xF) - 10 + 65)) : ((char)((b & 0xF) - 10 + 97))));
394 string text = ((
format ==
'x') ?
"0123456789abcdef" :
"0123456789ABCDEF");
397 byte b2 = destination2[num--];
398 span[num2++] =
text[b2 >> 4];
399 span[num2++] =
text[b2 & 0xF];
402 if (digits > valueStringBuilder.
Length)
404 valueStringBuilder.
Insert(0, (
value._sign >= 0) ?
'0' : ((
format ==
'x') ?
'f' :
'F'), digits - valueStringBuilder.
Length);
417 return valueStringBuilder.
ToString();
437 if (c ==
'x' || c ==
'X')
441 if (
value._bits ==
null)
443 if (c ==
'g' || c ==
'G' || c ==
'r' || c ==
'R')
445 formatSpan = (formatString = ((digits > 0) ? $
"D{digits}" :
"D"));
456 int num =
value._bits.Length;
465 num2 = unchecked(checked(num * 10) / 9) + 2;
471 array =
new uint[num2];
477 uint num5 =
value._bits[num4];
478 for (
int i = 0; i < num3; i++)
481 array[i] = (uint)(num6 % 1000000000);
482 num5 = (uint)(num6 / 1000000000);
486 array[num3++] = num5 % 1000000000;
490 array[num3++] = num5;
508 flag = c ==
'g' || c ==
'G' || c ==
'd' || c ==
'D' || c ==
'r' || c ==
'R';
511 if (digits > 0 && digits > num7)
519 num7 +=
info.NegativeSign.Length;
536 array2 =
new char[num8];
539 for (
int j = 0; j < num3 - 1; j++)
541 uint num10 =
array[j];
545 array2[--num9] = (char)(48 + num10 % 10);
549 for (uint num12 =
array[num3 - 1]; num12 != 0; num12 /= 10)
551 array2[--num9] = (char)(48 + num12 % 10);
555 bool sign = value._sign < 0;
557 int scale = num7 - num9;
558 Span<char> initialBuffer = stackalloc
char[128];
570 int num13 = num7 - num9;
571 while (digits > 0 && digits > num13)
573 array2[--num9] =
'0';
578 string negativeSign =
info.NegativeSign;
579 for (
int num14 = negativeSign.Length - 1; num14 > -1; num14--)
581 array2[--num9] = negativeSign[num14];
584 int num15 = num7 - num9;
589 return new string(array2, num9, num7 - num9);
593 charsWritten = num15;
static ArrayPool< T > Shared
static int FromChar(int c)
static byte Min(byte val1, byte val2)
static int DivRem(int a, int b, out int result)
static byte Max(byte val1, byte val2)
static char ParseFormatSpecifier(ReadOnlySpan< char > format, out int digits)
static bool TryParseBigInteger(ReadOnlySpan< char > value, NumberStyles style, NumberFormatInfo info, out BigInteger result)
static bool TryValidateParseStyleInteger(NumberStyles style, [NotNullWhen(false)] out ArgumentException e)
static bool TryParseBigInteger(string value, NumberStyles style, NumberFormatInfo info, out BigInteger result)
static BigInteger ParseBigInteger(ReadOnlySpan< char > value, NumberStyles style, NumberFormatInfo info)
static BigInteger ParseBigInteger(string value, NumberStyles style, NumberFormatInfo info)
static string FormatBigInteger(BigInteger value, string format, NumberFormatInfo info)
static string FormatBigInteger(bool targetSpan, BigInteger value, string formatString, ReadOnlySpan< char > formatSpan, NumberFormatInfo info, Span< char > destination, out int charsWritten, out bool spanSuccess)
static string FormatBigIntegerToHex(bool targetSpan, BigInteger value, char format, int digits, NumberFormatInfo info, Span< char > destination, out int charsWritten, out bool spanSuccess)
static readonly uint[] s_uint32PowersOfTen
static bool HexNumberToBigInteger(ref BigNumberBuffer number, out BigInteger result)
static bool TryFormatBigInteger(BigInteger value, ReadOnlySpan< char > format, NumberFormatInfo info, Span< char > destination, out int charsWritten)
static bool NumberToBigInteger(ref BigNumberBuffer number, out BigInteger result)
static ulong MakeUlong(uint uHi, uint uLo)
static void DangerousMakeTwosComplement(Span< uint > d)
static string Argument_InvalidNumberStyles
static string Overflow_ParseBigInteger
static string Format(string resourceFormat, object p1)
static string Argument_BadFormatSpecifier
static string Format_TooLarge
static string Argument_InvalidHexStyle
static BigNumberBuffer Create()
unsafe ReadOnlySpan< T > Span
ReadOnlySpan< T > Slice(int start)
override string ToString()
Span< T > Slice(int start)
ReadOnlyMemory< char > Current
ChunkEnumerator GetEnumerator()
void Insert(int index, string s)
override string ToString()
bool TryCopyTo(Span< char > destination, out int charsWritten)
Span< char > AppendSpan(int length)