number static method

num? number({
  1. required String title,
  2. num? defaultValue,
  3. num? min,
  4. num? max,
  5. num? step,
  6. FallbackNumberValidator? validator,
  7. bool returnDefaultOnEndOfInput = true,
})

Reads a number.

Empty input returns defaultValue. End-of-input also returns defaultValue unless returnDefaultOnEndOfInput is false. Invalid numbers, out-of-range values, and validator errors are reported before asking again.

Implementation

static num? number({
  required String title,
  num? defaultValue,
  num? min,
  num? max,
  num? step,
  FallbackNumberValidator? validator,
  bool returnDefaultOnEndOfInput = true,
}) {
  validateNumericConstraints(min: min, max: max, step: step);
  final normalizedDefault = defaultValue == null
      ? null
      : normalizeSteppedValue(
          defaultValue,
          min: min,
          max: max,
          step: step,
        );
  while (true) {
    _writePrompt(title, defaultValue: normalizedDefault?.toString());

    final line = TerminalContext.input.readLineSync();
    if (line == null) {
      return returnDefaultOnEndOfInput ? normalizedDefault : null;
    }

    final text = line.trim();
    if (text.isEmpty) return normalizedDefault;

    final value = num.tryParse(text);
    if (value == null) {
      _writeError('Enter a number.');
      continue;
    }
    if (!value.isFinite) {
      _writeError('Enter a finite number.');
      continue;
    }
    if (min != null && value < min) {
      _writeError('Enter a number at least $min.');
      continue;
    }
    if (max != null && value > max) {
      _writeError('Enter a number at most $max.');
      continue;
    }
    if (step != null && !_isStepAligned(value, step, min ?? 0)) {
      _writeError('Enter a value in increments of $step from ${min ?? 0}.');
      continue;
    }

    final error = _numberValidationError(value, validator);
    if (error != null) {
      _writeError(error);
      continue;
    }

    return value;
  }
}