Je voudrais m'appuyer sur la réponse de @omeralper, qui à mon avis a fourni une bonne base pour une solution solide.
Ce que je propose, c'est une version simplifiée et à jour avec les derniers standards du web. Il est important de noter que event.keycode est supprimé des normes Web et que les futures mises à jour du navigateur pourraient ne plus le prendre en charge. Voir https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
De plus, la méthode
String.fromCharCode(e.keyCode);
ne garantit pas que le keyCode se rapportant à la touche enfoncée par l'utilisateur correspond à la lettre attendue comme identifiée sur le clavier de l'utilisateur, car différentes configurations de clavier entraîneront un code de touche particulier de caractères différents. Son utilisation introduira des bogues difficiles à identifier et peut facilement interrompre la fonctionnalité pour certains utilisateurs. Je propose plutôt l'utilisation de event.key, voir la documentation ici https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
De plus, nous voulons seulement que la sortie résultante soit une décimale valide. Cela signifie que les nombres 1, 11.2, 5000.2341234 doivent être acceptés, mais que la valeur 1.1.2 ne doit pas être acceptée.
Notez que dans ma solution, j'exclus la fonctionnalité couper, copier et coller car elle ouvre les fenêtres pour les bogues, en particulier lorsque les gens collent du texte indésirable dans les champs associés. Cela nécessiterait un processus de nettoyage sur un gestionnaire de keyup; ce qui n'est pas la portée de ce fil.
Voici la solution que je propose.
import { Directive, ElementRef, HostListener } from '@angular/core';
@Directive({
selector: '[myNumberOnly]'
})
export class NumberOnlyDirective {
private regex: RegExp = new RegExp(/^[0-9]+(\.[0-9]*){0,1}$/g);
private specialKeys: Array<string> = [ 'Backspace', 'Tab', 'End', 'Home' ];
constructor(private el: ElementRef) {
}
@HostListener('keydown', [ '$event' ])
onKeyDown(event: KeyboardEvent) {
if (this.specialKeys.indexOf(event.key) !== -1) {
return;
}
let current: string = this.el.nativeElement.value;
let next: string = current.concat(event.key);
if (next && !String(next).match(this.regex)) {
event.preventDefault();
}
}
}