Пример #1
0
        /// <summary>
        /// Reads the next number as a <see cref="double"/>.
        /// </summary>
        /// <param name="reader">A <see cref="TextReader" /> object.</param>
        /// <returns>The next number as a <see cref="double"/>; or <c>null</c> if reading fails.</returns>
        public static double?ReadNumber(this TextReader reader)
        {
            int    ci;
            var    negative = false;
            double num      = 0;

            while ((ci = reader.Read()) != -1)
            {
                var c = (char)ci;
                if (ci == '+')
                {
                    c = reader.ReadNonWhitespace();
                    if (!c.IsASCIIDigit())
                    {
                        return(null);
                    }
                    num = c - '0';
                    break;
                }
                else if (ci == '-')
                {
                    negative = true;
                    c        = reader.ReadNonWhitespace();
                    if (!c.IsASCIIDigit())
                    {
                        return(null);
                    }
                    num = c - '0';
                    break;
                }
                else if (c.IsASCIIDigit())
                {
                    num = c - '0';
                    break;
                }
            }

            while ((ci = reader.Read()) != -1 && ((char)ci).IsASCIIDigit())
            {
                num = num * 10 + ci - '0';
            }

            if (ci == '.')
            {
                double @base = 10;
                while ((ci = reader.Read()) != -1 && ((char)ci).IsASCIIDigit())
                {
                    num   += (ci - '0') / @base;
                    @base *= 10;
                }
            }

            return(negative ? -num : num);
        }
Пример #2
0
        /// <summary>
        /// Reads the next integer at most 32-bit large.
        /// </summary>
        /// <param name="reader">A <see cref="TextReader" /> object.</param>
        /// <returns>The next integer; or <c>null</c> if reading fails.</returns>
        public static int?ReadInteger(this TextReader reader)
        {
            int ci;
            var negative = false;
            int num      = 0;

            while ((ci = reader.Read()) != -1)
            {
                var c = (char)ci;
                if (ci == '+')
                {
                    c = reader.ReadNonWhitespace();
                    if (!c.IsASCIIDigit())
                    {
                        return(null);
                    }
                    num = c - '0';
                    break;
                }
                else if (ci == '-')
                {
                    negative = true;
                    c        = reader.ReadNonWhitespace();
                    if (!c.IsASCIIDigit())
                    {
                        return(null);
                    }
                    num = c - '0';
                    break;
                }
                else if (c.IsASCIIDigit())
                {
                    num = c - '0';
                    break;
                }
            }

            while ((ci = reader.Read()) != -1 && ((char)ci).IsASCIIDigit())
            {
                num = num * 10 + ci - '0';
            }

            return(negative ? -num : num);
        }