parseNumber static method
Converts the lexeme of a number, tolerating the forms real producers
emit: 4., .5, --3, 6.-2, 1e3.
Implementation
static double parseNumber(String text) {
final direct = double.tryParse(text);
if (direct != null && direct.isFinite) return direct;
final buffer = StringBuffer();
var negative = false;
var seenDot = false;
var seenDigit = false;
var seenSign = false;
for (var i = 0; i < text.length; i++) {
final char = text[i];
if (char == '-' || char == '+') {
// A sign after a digit ends the number: `6.-2` reads as 6, the way
// tolerant readers do it. Repeated signs before the first digit are
// ignored, only the first one counts.
if (seenDigit || seenDot) break;
if (!seenSign) {
seenSign = true;
negative = char == '-';
}
continue;
}
if (char == '.') {
if (seenDot) break;
seenDot = true;
buffer.write('.');
continue;
}
if (char.codeUnitAt(0) >= 0x30 && char.codeUnitAt(0) <= 0x39) {
seenDigit = true;
buffer.write(char);
continue;
}
break; // invalid exponent or garbage
}
if (!seenDigit) return 0;
final value = double.tryParse(buffer.toString()) ?? 0;
return negative ? -value : value;
}