Форматирование данных в инпут. Маска для инпута рубли и копейки.(Vue directive)
Всем привет.
Подскажите, пожалуйста, может кто делал подобное.
Нужно реализовать директиву для инпута. Смысл ее такой: Например: Ввод с клавиатуры "5" - отображается "0.05". Ввод с клавиатуры "1005" - отображается "10.05". Две последние введенные цифры отделяются от предыдущих точкой.
Какую регулярку добавить вместо этой replace(/\B(?=(\d{3})+(?!\d))/g, '.')?
Vue.directive('format', {
bind(el: HTMLElement, binding: any, vnode: VNode) {
const { modifiers } = binding;
const targetElement = el;
if (modifiers.cost) {
targetElement.addEventListener('input', (e: any) => {
e.target.value = e.target.value.replace(/[^0-9]/g, '').replace(/\B(?=(\d{3})+(?!\d))/g, '.');
});
}
},
update(el: HTMLElement, binding: any, vnode: VNode) {
const { modifiers } = binding;
const targetElement = el;
if (modifiers.cost) {
targetElement.addEventListener('input', (e: any) => {
e.target.value = e.target.value.replace(/[^0-9]/g, '').replace(/\B(?=(\d{3})+(?!\d))/g, '.');
});
}
},
});
Ответы (1 шт):
Автор решения: Wiktor Stribiżew
→ Ссылка
Вы можете использовать
x.replace(/\B\d{2}$/,'.$&').replace(/^\d{2}$/,'0.$&').replace(/^\d$/,'0.0$&')
Ещё один вариант:
x.replace(/(\d)(\d{0,2})$/, (m,n,o) => m.length == 3 ? `${n}.${o}` : m.length == 2 ? `0.${m}` : `0.0${m}`)
Подробности
^- начало строки\B- позиция в строке, отличная от границы слова (тут между двух цифр)\d{2}- две цифры(\d{0,2})- Захватывающая подмаска: ноль, одна или две цифры$- конец строки.
$& ссылается на значение целого совпадения. В (m,n,o) m означает целое совпадение, n – первая подмаска, o — вторая подмаска.
См. пример на JavaScript:
const arr = ['1', '12', '123'];
// Вариант №1
arr.forEach(x => console.log(x, '=>', x.replace(/\B\d{2}$/,'.$&').replace(/^\d$/,'0.0$&').replace(/^\d{2}$/,'0.$&')))
// Вариант №2
arr.forEach(x => console.log(x, '=>', x.replace(/(\d)(\d{0,2})$/, (m,n,o) => m.length == 3 ? `${n}.${o}` : m.length == 2 ? `0.${m}` : `0.0${m}` )))