private object ReadNumber()
{
char ch = (char)_reader.Read();
StringBuilder sb = new StringBuilder();
bool hasDecimal = (ch == '.');
sb.Append(ch);
while (true) {
ch = PeekNextSignificantCharacter();
if (Char.IsDigit(ch) || (ch == '.')) {
hasDecimal = hasDecimal || (ch == '.');
_reader.Read();
sb.Append(ch);
}
else {
break;
}
}
string s = sb.ToString();
if (hasDecimal) {
float value;
if (Single.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, out value)) {
return value;
}
}
else {
int value;
if (Int32.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, out value)) {
return value;
}
else {
long lvalue;
if (Int64.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, out lvalue)) {
return lvalue;
}
}
}
throw new FormatException("Invalid numeric literal.");
}