示例#1
0
        public static String ScanDecimalString(this TextReader reader, NumericSignMode mode, CultureInfo culture)
        {
            CultureInfo usedCulture = culture == null ? CultureInfo.CurrentCulture : culture;

            String numeric = reader.ScanNumericString(mode);

            if (numeric == null)
            {
                return(null);
            }

            if (!reader.Skip(usedCulture.NumberFormat.NumberDecimalSeparator))
            {
                return(numeric);
            }

            String decimals = reader.ScanNumericString(NumericSignMode.AllowNone);

            if (decimals == null)
            {
                return(null);
            }

            StringBuilder builder = new StringBuilder().Append(numeric).Append(usedCulture.NumberFormat.NumberDecimalSeparator).Append(decimals);

            if (reader.Skip('e'))
            {
                String shifterNumeric = reader.ScanNumericString(NumericSignMode.RequireOne);
                if (shifterNumeric != null)
                {
                    builder.Append('e').Append(shifterNumeric);
                }
            }

            return(builder.ToString());
        }
示例#2
0
 public static String ScanDecimalString(this TextReader reader, NumericSignMode mode)
 {
     return(ScanDecimalString(reader, mode, null));
 }
示例#3
0
        public static String ScanNumericString(this TextReader reader, NumericSignMode mode)
        {
            StringBuilder builder = new StringBuilder();

            while (true)
            {
                int intCh = reader.Peek();
                if (intCh == '-' || intCh == '+')
                {
                    if (builder.Length > 0)
                    {
                        return(builder.ToString());
                    }

                    switch (mode)
                    {
                    case NumericSignMode.AllowNone:
                        return(null);

                    default:
                        if (intCh == '-' && (mode == NumericSignMode.AllowPlusOnly || mode == NumericSignMode.RequirePlus))
                        {
                            return(null);
                        }
                        else if (intCh == '+' && (mode == NumericSignMode.AllowMinusOnly || mode == NumericSignMode.RequireMinus))
                        {
                            return(null);
                        }
                        break;
                    }
                }
                else if (intCh == -1 || (intCh < '0' || intCh > '9'))
                {
                    if (builder.Length == 0)
                    {
                        return(null);
                    }
                    return(builder.ToString());
                }

                if (builder.Length == 0)
                {
                    switch (mode)
                    {
                    case NumericSignMode.RequireOne:
                        if (intCh != '-' && intCh != '+')
                        {
                            return(null);
                        }
                        break;

                    case NumericSignMode.RequirePlus:
                        if (intCh != '+')
                        {
                            return(null);
                        }
                        break;

                    case NumericSignMode.RequireMinus:
                        if (intCh != '-')
                        {
                            return(null);
                        }
                        break;
                    }
                }

                builder.Append((Char)reader.Read());
            }
        }