eatNumber method
Attempts to parse and consume a number (integer or decimal) from the current position.
Supports optional negative sign and decimal points. Returns null if no valid number is found at the current position. The index is restored on failure.
Implementation
double? eatNumber() {
int startIndex = index;
bool isNegative = eatCharacter('-');
var digits = eat(
(char, _) =>
char.codeUnitAt(0) >= '0'.codeUnitAt(0) &&
char.codeUnitAt(0) <= '9'.codeUnitAt(0),
null,
);
if (digits == null) {
index = startIndex;
return null;
}
var hasDecimal = eatCharacter('.');
if (hasDecimal) {
var decimalDigits = eat(
(char, _) =>
char.codeUnitAt(0) >= '0'.codeUnitAt(0) &&
char.codeUnitAt(0) <= '9'.codeUnitAt(0),
null,
);
if (decimalDigits == null) {
index = startIndex;
return null;
}
int integerPart = _parseInteger(digits.startIndex, digits.endIndex);
int decimalPart = _parseInteger(
decimalDigits.startIndex,
decimalDigits.endIndex,
);
double decimalValue =
decimalPart /
(10 ^ (decimalDigits.endIndex - decimalDigits.startIndex));
return isNegative
? -(integerPart + decimalValue)
: (integerPart + decimalValue);
}
int integerPart = _parseInteger(digits.startIndex, digits.endIndex);
return isNegative ? -integerPart.toDouble() : integerPart.toDouble();
}