validate method

  1. @override
Map<String, dynamic>? validate(
  1. AbstractControl control
)
override

Validates the control.

Implementation

@override
Map<String, dynamic>? validate(AbstractControl<dynamic> control) {
  // Skip validation if null value is allowed
  if (allowNull && control.value == null) {
    return null;
  }

  if (control.value == null) {
    return <String, dynamic>{
      ValidationMessage.number: NumberValidatorError.nullValue,
    };
  }

  // Check for leading/trailing spaces
  final numberString = control.value.toString().trim();

  // Check for empty string
  if (numberString.isEmpty) {
    return <String, dynamic>{
      ValidationMessage.number: NumberValidatorError.invalidNumber,
    };
  }

  // Check for negative sign, if allowed
  final hasNegativeSign = numberString.startsWith('-');
  if (hasNegativeSign && !allowNegatives) {
    return <String, dynamic>{
      ValidationMessage.number: NumberValidatorError.unsignedNumber,
    };
  }

  // Remove the negative sign, if present, for further validation
  final unsignedNumberString =
      hasNegativeSign ? numberString.substring(1) : numberString;

  // Check for valid decimal positions
  if (!_validateNumberDecimals(allowedDecimals, unsignedNumberString)) {
    return <String, dynamic>{
      ValidationMessage.number: NumberValidatorError.invalidDecimals,
    };
  }

  // Check for valid numeric characters using a regular expression
  if (unsignedNumberString.contains(notNumbersRegex)) {
    return <String, dynamic>{
      ValidationMessage.number: NumberValidatorError.invalidNumber,
    };
  }

  // No errors, the control value is a valid number
  return null;
}