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