@Omeralper tarafından verilen cevaba dayanarak, bence sağlam bir çözüm için iyi bir temel sağladı.
Önerdiğim şey, en son web standartlarına sahip basitleştirilmiş ve güncel bir sürüm. Event.keycode'un web standartlarından kaldırıldığını ve gelecekteki tarayıcı güncellemelerinin artık desteklemeyebileceğini unutmamak önemlidir. Bkz. Https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
Ayrıca yöntem
String.fromCharCode(e.keyCode);
farklı klavye konfigürasyonları belirli bir tuş kodu farklı karakterlerle sonuçlanacağından, kullanıcı tarafından basılan tuşa ait keyCode'un, kullanıcının klavyesinde tanımlanan beklenen harf ile eşleşeceğini garanti etmez. Bunu kullanmak, tanımlanması zor olan hatalar ortaya çıkarır ve belirli kullanıcılar için işlevselliği kolayca bozabilir. Bunun yerine, event.key kullanımını öneriyorum, buradaki belgelere bakın https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
Dahası, elde edilen çıktının sadece geçerli bir ondalık olmasını istiyoruz. Bu, 1, 11.2, 5000.2341234 sayılarının kabul edilmesi gerektiği ancak 1.1.2 değerinin kabul edilmemesi gerektiği anlamına gelir.
Çözümümde, özellikle insanlar ilişkili alanlara istenmeyen metinler yapıştırdıklarında, hatalar için pencereler açtığı için kes, kopyala ve yapıştır işlevini hariç tuttuğumu unutmayın. Bu, bir anahtarlama işleyicisinde bir temizleme işlemi gerektirirdi; bu iş parçacığının kapsamı değil.
İşte önerdiğim çözüm.
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();
}
}
}