Пример #1
0
        /// <summary>
        /// Attempts to parse a string slice into a bool.
        /// </summary>
        static public bool TryParseBool(StringSlice inSlice, out bool outBool)
        {
            inSlice = inSlice.Trim();

            if (inSlice.Length == 0)
            {
                outBool = false;
                return(false);
            }

            if (inSlice.Equals("true", true))
            {
                outBool = true;
                return(true);
            }

            if (inSlice.Equals("false", true))
            {
                outBool = false;
                return(true);
            }

            outBool = false;
            return(false);
        }
Пример #2
0
        /// <summary>
        /// Attempts to parse a string slice into a float.
        /// </summary>
        static public bool TryParseFloat(StringSlice inSlice, out float outFloat)
        {
            inSlice = inSlice.Trim();

            if (inSlice.Length == 0)
            {
                outFloat = 0;
                return(false);
            }

            if (inSlice.Equals("Infinity"))
            {
                outFloat = float.PositiveInfinity;
                return(true);
            }

            if (inSlice.Equals("-Infinity"))
            {
                outFloat = float.NegativeInfinity;
                return(true);
            }

            if (inSlice.Equals("NaN"))
            {
                outFloat = float.NaN;
                return(true);
            }

            int evalMode = EvaluateFloatMode(inSlice);

            if (evalMode == DoNotRead)
            {
                outFloat = 0;
                return(false);
            }
            else if (evalMode == ReadAsInteger)
            {
                long l;
                if (TryParseLongInternal(inSlice, false, out l))
                {
                    outFloat = (float)l;
                    return(true);
                }
            }
            else if (evalMode == ReadAsDecimalPlace)
            {
                double d;
                if (TryParseLongDouble(inSlice, out d))
                {
                    outFloat = (float)d;
                    return(true);
                }
            }

            return(float.TryParse(inSlice.ToString(), NumberStyles.Float, CultureInfo.InvariantCulture, out outFloat));
        }
Пример #3
0
        /// <summary>
        /// Attempts to parse a string slice into a ulong.
        /// </summary>
        static public bool TryParseULong(StringSlice inSlice, out ulong outULong)
        {
            inSlice = inSlice.Trim();

            if (inSlice.StartsWith("0x"))
            {
                return(TryParseHex(inSlice.Substring(2), 16, out outULong));
            }

            if (inSlice.Length == 0 || TooLong(inSlice, MaxDigits64))
            {
                outULong = 0;
                return(false);
            }

            decimal accum = 0;
            char    c;

            for (int i = 0; i < inSlice.Length; ++i)
            {
                c = inSlice[i];

                if (c == Negative)
                {
                    outULong = 0;
                    return(false);
                }
                if (c == Positive)
                {
                    if (i > 0)
                    {
                        outULong = 0;
                        return(false);
                    }

                    continue;
                }

                if (!IsDigit(c))
                {
                    outULong = 0;
                    return(false);
                }

                accum = (accum * 10) + (ulong)(c - '0');
            }

            if (accum > ulong.MaxValue)
            {
                outULong = 0;
                return(false);
            }

            outULong = (uint)accum;
            return(true);
        }
Пример #4
0
                public StringSlice Process(StringSlice inSlice)
                {
                    StringSlice slice = inSlice.Trim();

                    if (slice.Length >= 2 && slice.StartsWith('"') && slice.EndsWith('"'))
                    {
                        slice = slice.Substring(1, slice.Length - 2);
                    }

                    // if this contains escaped CSV sequences, unescape it here
                    if (m_Unescape && (slice.Contains("\\") || slice.Contains("\\\"")))
                    {
                        return(slice.Unescape(Escaper.Instance));
                    }
                    return(slice);
                }
Пример #5
0
        /// <summary>
        /// Attempts to parse a string slice into a byte.
        /// </summary>
        static public bool TryParseByte(StringSlice inSlice, out byte outByte)
        {
            inSlice = inSlice.Trim();

            if (inSlice.StartsWith("0x"))
            {
                ulong hex;
                if (TryParseHex(inSlice.Substring(2), 2, out hex))
                {
                    outByte = (byte)hex;
                    return(true);
                }

                outByte = 0;
                return(false);
            }

            if (inSlice.Length == 0 || TooLong(inSlice, MaxDigits8))
            {
                outByte = 0;
                return(false);
            }

            int  accum = 0;
            char c;

            for (int i = 0; i < inSlice.Length; ++i)
            {
                c = inSlice[i];

                if (c == Negative)
                {
                    outByte = 0;
                    return(false);
                }
                if (c == Positive)
                {
                    if (i > 0)
                    {
                        outByte = 0;
                        return(false);
                    }

                    continue;
                }

                if (!IsDigit(c))
                {
                    outByte = 0;
                    return(false);
                }

                accum = (accum * 10) + (c - '0');
            }

            if (accum > byte.MaxValue)
            {
                outByte = 0;
                return(false);
            }

            outByte = (byte)accum;
            return(true);
        }
Пример #6
0
        static private bool TryParseLongInternal(StringSlice inSlice, bool inbCheckHex, out long outLong)
        {
            inSlice = inSlice.Trim();

            if (inbCheckHex && inSlice.StartsWith("0x"))
            {
                ulong hex;
                if (TryParseHex(inSlice.Substring(2), 16, out hex))
                {
                    outLong = (long)hex;
                    return(true);
                }

                outLong = 0;
                return(false);
            }

            if (inSlice.Length == 0 || TooLong(inSlice, MaxDigits64))
            {
                outLong = 0;
                return(false);
            }

            decimal accum = 0;
            char    c;
            int     sign = 1;

            for (int i = 0; i < inSlice.Length; ++i)
            {
                c = inSlice[i];

                if (c == Negative)
                {
                    if (i > 0)
                    {
                        outLong = 0;
                        return(false);
                    }

                    sign = -1;
                    continue;
                }
                else if (c == Positive)
                {
                    if (i > 0)
                    {
                        outLong = 0;
                        return(false);
                    }

                    continue;
                }

                if (!IsDigit(c))
                {
                    outLong = 0;
                    return(false);
                }

                accum = (accum * 10) + (c - '0');
            }

            accum *= sign;

            if (accum > long.MaxValue || accum < long.MinValue)
            {
                outLong = 0;
                return(false);
            }

            outLong = (long)accum;
            return(true);
        }
Пример #7
0
        /// <summary>
        /// Attempts to parse a string slice into an int.
        /// </summary>
        static public bool TryParseInt(StringSlice inSlice, out int outInt)
        {
            inSlice = inSlice.Trim();

            if (inSlice.StartsWith("0x"))
            {
                ulong hex;
                if (TryParseHex(inSlice.Substring(2), 8, out hex))
                {
                    outInt = (int)hex;
                    return(true);
                }

                outInt = 0;
                return(false);
            }

            if (inSlice.Length == 0 || TooLong(inSlice, MaxDigits32))
            {
                outInt = 0;
                return(false);
            }

            long accum = 0;
            char c;
            int  sign = 1;

            for (int i = 0; i < inSlice.Length; ++i)
            {
                c = inSlice[i];

                if (c == Negative)
                {
                    if (i > 0)
                    {
                        outInt = 0;
                        return(false);
                    }

                    sign = -1;
                    continue;
                }
                else if (c == Positive)
                {
                    if (i > 0)
                    {
                        outInt = 0;
                        return(false);
                    }

                    continue;
                }

                if (!IsDigit(c))
                {
                    outInt = 0;
                    return(false);
                }

                accum = (accum * 10) + (c - '0');
            }

            accum *= sign;

            if (accum > int.MaxValue || accum < int.MinValue)
            {
                outInt = 0;
                return(false);
            }

            outInt = (int)accum;
            return(true);
        }