Прямо сейчас я делаю директиву маски валюты, которая должна быть совместима с угловыми реактивными формами. Вот мой Stabblitz https://stackblitz.com/edit/angular-8-currency-directive-insert.
В элементе ввода я ожидаю, что когда я введу 1, затем 2, затем 3, затем 4, затем 5, я бы увидел в консоли {currency: "$ 1,234"}, потому что маска запускает .substring (0, 4) однако я вижу {валюта: "$ 1,2345"}.
Я вижу правильное отображаемое значение в $ 1234 внутри элемента ввода.
Если я изменю .substring (0,4) на .substring (0,3), тогда отображаемое значение в элементе ввода отображает 1,23 доллара, когда я ожидаю, что оно отобразит 1,234 доллара. Консоль выводит правильное значение {currency: "$ 1,234"}
Любые предложения, которые доходят до корня проблемы, очень приветствуются! Я уже поработал над обходом, который включает такие вещи, как разбиение на массив, проверка, удаление с конца и объединение, но эти исправления не идеальны. Любые предложения все еще приветствуются!
Спасибо за вашу поддержку.
Код, на котором следует сосредоточиться, находится в файле currency.directive.ts, указанном ниже:
onInputChange(event, backspace) {
let newVal = event.replace(/\D/g, '');
if (newVal.length === 0) {
newVal = '';
} else if (newVal.length <= 3) {
newVal = newVal.replace(/^(\d{0,3})/, '$1');
// } else if (newVal.length <= 4) {
// newVal = newVal.replace(/^(\d{0,1})(\d{0,3})/, '$1,$2');
} else {
newVal = newVal.substring(0, 4);
newVal = newVal.replace(/^(\d{0,1})(\d{1,3})/, '$1,$2');
}
this.ngControl.valueAccessor.writeValue("$"+ newVal);
// console.log(this.toNumber(newVal))
}