Я использую регулярное выражение из другого вопроса , но я обнаружил проблему в моем случае с точкой.
Я хочу разрешить пользователю размещать не более 3 цифр, затем запятую или точку, которую я заменяю точкой, в противном случае, затем до 4 цифр, и это прекрасно работает.
export class DecimalValidator {
private regex: RegExp = new RegExp(/(^[0-9]{1,3})+([,.][0-9]{0,4}){0,1}$/g);
private specialKeys: Array<string> = ['Backspace', 'Tab', 'End', 'Home', 'ArrowLeft', 'ArrowRight', 'Del', 'Delete', ',', '.'];
constructor(private el: ElementRef) {
}
@HostListener('keydown', ['$event'])
onKeyDown(event: KeyboardEvent) {
if (this.specialKeys.includes(event.key)) {
return;
}
const current: string = this.el.nativeElement.value;
const position = this.el.nativeElement.selectionStart;
let next: string = [current.slice(0, position), event.key === 'Decimal' ? '.' : event.key, current.slice(position)].join('');
next = next.replace(/[,.]/g, m => (m === ',' ? '.' : '.'));
if (next && !String(next).match(this.regex)) {
event.preventDefault();
}
}
}
Я хочу разрешить пользователю удалять точку, если после точки нет цифр, но не разрешать ее, если после точки есть цифры.
#ALLOW: 123.
#NOT ALLOW: 123.2
Таким образом, если после точки точка есть какие-либо числа, пользователь может нажимать клавишу Backspace столько раз, сколько ему нужно, но это ничего не меняет на входе.
Могу ли я сделать это здесь, в этой директиве?