Пример #1
0
        internal static unsafe bool TryParseBigInteger(string value, NumberStyles style, NumberFormatInfo info, out BigInteger result)
        {
            ArgumentException exception;

            result = BigInteger.Zero;
            if (!TryValidateParseStyleInteger(style, out exception))
            {
                throw exception;
            }
            BigNumberBuffer number      = BigNumberBuffer.Create();
            byte *          stackBuffer = stackalloc byte[0x72];

            Number.NumberBuffer buffer2 = new Number.NumberBuffer(stackBuffer);
            result = 0;
            if (!Number.TryStringToNumber(value, style, ref buffer2, number.digits, info, false))
            {
                return(false);
            }
            number.precision = buffer2.precision;
            number.scale     = buffer2.scale;
            number.sign      = buffer2.sign;
            if ((style & NumberStyles.AllowHexSpecifier) != NumberStyles.None)
            {
                if (!HexNumberToBigInteger(ref number, ref result))
                {
                    return(false);
                }
            }
            else if (!NumberToBigInteger(ref number, ref result))
            {
                return(false);
            }
            return(true);
        }
Пример #2
0
        internal static bool TryParseBigInteger(string value, NumberStyles style, NumberFormatInfo info, out BigInteger result)
        {
            result = Zero;
            if (!TryValidateParseStyleInteger(style, out ArgumentException e))
            {
                throw e; // TryParse still throws ArgumentException on invalid NumberStyles
            }
            if (value == null)
            {
                return(false);
            }
            var number = BigNumberBuffer.Create();

            if (!ParseNumber(new StringProcessor(value), style, number, info))
            {
                return(false);
            }
            if ((style & NumberStyles.AllowHexSpecifier) != 0)
            {
                if (!HexNumberToBigInteger(number, ref result))
                {
                    return(false);
                }
            }
            else
            {
                if (!NumberToBigInteger(number, out result))
                {
                    return(false);
                }
            }
            return(true);
        }
Пример #3
0
        internal static bool TryParseBigInteger(ReadOnlySpan <char> value, NumberStyles style, NumberFormatInfo info, out BigInteger result)
        {
            unsafe
            {
                result = BigInteger.Zero;
                ArgumentException e;
                if (!TryValidateParseStyleInteger(style, out e))
                {
                    throw e; // TryParse still throws ArgumentException on invalid NumberStyles
                }
                BigNumberBuffer bignumber = BigNumberBuffer.Create();
                if (!FormatProvider.TryStringToBigInteger(value, style, info, bignumber.digits, out bignumber.precision, out bignumber.scale, out bignumber.sign))
                {
                    return(false);
                }

                if ((style & NumberStyles.AllowHexSpecifier) != 0)
                {
                    if (!HexNumberToBigInteger(ref bignumber, ref result))
                    {
                        return(false);
                    }
                }
                else
                {
                    if (!NumberToBigInteger(ref bignumber, ref result))
                    {
                        return(false);
                    }
                }
                return(true);
            }
        }
Пример #4
0
        internal unsafe static Boolean TryParseBigInteger(String value, NumberStyles style, NumberFormatInfo info, out BigInteger result)
        {
            result = BigInteger.Zero;
            ArgumentException e;

            if (!TryValidateParseStyleInteger(style, out e))
            {
                throw e; // TryParse still throws ArgumentException on invalid NumberStyles
            }
            BigNumberBuffer bignumber         = BigNumberBuffer.Create();
            Byte *          numberBufferBytes = stackalloc Byte[Number.NumberBuffer.NumberBufferBytes];

            Number.NumberBuffer number = new Number.NumberBuffer(numberBufferBytes);
            result = 0;

            if (!Number.TryStringToNumber(value, style, ref number, bignumber.digits, info, false))
            {
                return(false);
            }
            bignumber.precision = number.precision;
            bignumber.scale     = number.scale;
            bignumber.sign      = number.sign;

            if ((style & NumberStyles.AllowHexSpecifier) != 0)
            {
                if (!HexNumberToBigInteger(ref bignumber, ref result))
                {
                    return(false);
                }
            }
            else
            {
                if (!NumberToBigInteger(ref bignumber, ref result))
                {
                    return(false);
                }
            }
            return(true);
        }