Ich möchte auf der Antwort von @omeralper aufbauen, die meiner Meinung nach eine gute Grundlage für eine solide Lösung bot.
Was ich vorschlage, ist eine vereinfachte und aktuelle Version mit den neuesten Webstandards. Es ist wichtig zu beachten, dass event.keycode aus den Webstandards entfernt wird und zukünftige Browser-Updates dies möglicherweise nicht mehr unterstützen. Siehe https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
Weiterhin ist die Methode
String.fromCharCode(e.keyCode);
garantiert nicht, dass der keyCode, der sich auf die vom Benutzer gedrückte Taste bezieht, dem erwarteten Buchstaben entspricht, der auf der Tastatur des Benutzers angegeben ist, da unterschiedliche Tastaturkonfigurationen dazu führen, dass ein bestimmter Keycode unterschiedliche Zeichen enthält. Wenn Sie dies verwenden, treten Fehler auf, die schwer zu identifizieren sind und die Funktionalität für bestimmte Benutzer leicht beeinträchtigen können. Ich schlage eher die Verwendung von event.key vor, siehe Dokumente hier https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
Außerdem möchten wir nur, dass die resultierende Ausgabe eine gültige Dezimalzahl ist. Dies bedeutet, dass die Nummern 1, 11.2, 5000.2341234 akzeptiert werden sollten, der Wert 1.1.2 jedoch nicht akzeptiert werden sollte.
Beachten Sie, dass ich in meiner Lösung die Funktionen zum Ausschneiden, Kopieren und Einfügen ausschließe, da Fenster für Fehler geöffnet werden, insbesondere wenn unerwünschte Texte in zugehörige Felder eingefügt werden. Dies würde einen Bereinigungsprozess für einen Keyup-Handler erfordern. Das ist nicht der Umfang dieses Threads.
Hier ist die Lösung, die ich vorschlage.
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();
}
}
}