Comment valider une entrée de type="number"
pour qu'elle ne soit valide que si la valeur est numérique ou nulle en utilisant uniquement des formulaires réactifs (pas de directives)?
Seuls les nombres [0-9]
et. sont autorisés, pas de "e" ni aucun autre caractère.
Ce que j'ai essayé jusqu'à présent:
<form [formGroup]="form" novalidate>
<input type="number" formControlName="number" id="number">
</form>
export class App {
form: FormGroup = new FormGroup({});
constructor(
private fb: FormBuilder,
) {
this.form = fb.group({
number: ['', [CustomValidator.numeric]]
})
}
}
export class CustomValidator{
// Number only validation
static numeric(control: AbstractControl) {
let val = control.value;
if (val === null || val === '') return null;
if (!val.toString().match(/^[0-9]+(\.?[0-9]+)?$/)) return { 'invalidNumber': true };
return null;
}
}
Le problème est lorsqu'un utilisateur entre quelque chose qui n'est pas un nombre ("123e" ou "abc")} _ la valeur du FormControl devient null
, gardez à l'esprit que je ne veux pas que le champ soit obligatoire, donc si le champ est vraiment vide null
la valeur doit être valide.
La prise en charge de plusieurs navigateurs est également importante (les champs de saisie du numéro de Chrome ne permettent pas à l'utilisateur de saisir des lettres - à l'exception de "e", contrairement à FireFox et Safari).
Dans un fichier HTML, vous pouvez ajouter ngIf pour votre motif comme ceci
<div class="form-control-feedback" *ngIf="Mobile.errors && (Mobile.dirty || Mobile.touched)">
<p *ngIf="Mobile.errors.pattern" class="text-danger">Number Only</p>
</div>
Dans le fichier .ts, vous pouvez ajouter le motif Validators - "^ [0-9] * $"
this.Mobile = new FormControl('', [
Validators.required,
Validators.pattern("^[0-9]*$"),
Validators.minLength(8),
]);
Le moyen le plus simple serait d’utiliser une bibliothèque comme celle-ci one et vous voulez que noStrings
soit vrai
export class CustomValidator{ // Number only validation
static numeric(control: AbstractControl) {
let val = control.value;
const hasError = validate({val: val}, {val: {numericality: {noStrings: true}}});
if (hasError) return null;
return val;
}
}
Parfois, il est simplement plus facile d'essayer quelque chose de simple comme celui-ci.
validateNumber(control: FormControl): { [s: string]: boolean } {
//revised to reflect null as an acceptable value
if (control.value === null) return null;
// check to see if the control value is no a number
if (isNaN(control.value)) {
return { 'NaN': true };
}
return null;
}
J'espère que cela t'aides.
mis à jour selon le commentaire, Vous devez appeler le validateur comme ceci
number: new FormControl('',[this.validateNumber.bind(this)])
La liaison (ceci) est nécessaire si vous mettez le validateur dans le composant, comme je le fais.
Vous devez utiliser des expressions régulières dans votre validateur personnalisé. Par exemple, voici le code qui n'autorise que 9 chiffres dans les champs de saisie:
function ssnValidator(control: FormControl): {[key: string]: any} {
const value: string = control.value || '';
const valid = value.match(/^\d{9}$/);
return valid ? null : {ssn: true};
}
Jetez un oeil à un exemple d'application ici: