eatNumber method

double? eatNumber()

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();
}