Beispiel #1
0
        /// <summary>
        /// Scans the number.
        /// </summary>
        /// <returns>Token containing number.</returns>
        public StiToken ScanNumber()
        {
            int posStart = positionInText;

            bool isFloat = false;

            while (positionInText != Text.Length && Char.IsDigit(Text[positionInText]))
            {
                positionInText++;
            }

            if (positionInText != Text.Length && Text[positionInText] == '.' &&
                positionInText + 1 != Text.Length && Char.IsDigit(Text[positionInText + 1]))
            {
                positionInText++;
                while (positionInText != Text.Length && Char.IsDigit(Text[positionInText]))
                {
                    positionInText++;
                }
                isFloat = true;
            }

            string nm = BaseText.Substring(posStart, positionInText - posStart);

            if (isFloat)
            {
                var nfi = new NumberFormatInfo
                {
                    CurrencyDecimalSeparator = "."
                };

                return(new StiToken(StiTokenType.Value, posStart, positionInText - posStart,
                                    double.Parse(nm, nfi)));
            }
            else
            {
                string valueStr = nm;
                try
                {
                    ulong value = ulong.Parse(valueStr);
                    return(new StiToken(StiTokenType.Value, posStart, positionInText - posStart,
                                        value));
                }
                catch (Exception e)
                {
                    if (e is OverflowException || e is FormatException)
                    {
                        return(new StiToken(StiTokenType.Value, posStart, positionInText - posStart, valueStr));
                    }
                    else
                    {
                        throw;
                    }
                }
            }
        }