parseNumber static method

double parseNumber(
  1. String text
)

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