Форматирование данных в инпут. Маска для инпута рубли и копейки.(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}` )))

→ Ссылка