При вводе на vue.js в input чисел нужно чтобы они разбивались на разряды и разделялись пробелами тысячные. Как это реализовать на VUE.js?

Во vue.js есть input куда должны вводиться только числовые значения и при тысячи, значение должно разбиваться пробелом, как это можно реализовать на Vue.js что бы сразу после потери фокуса число билось на тысячные разделенное пробелом? Пример input из проекта

    <input
                        @keypress="
                          isNumber(
                            $event,
                            tb.UF_IS_MINUS,
                            indicators.indicators.AMORTIZATION[tb.ID][
                              year.UF_YEAR
                            ].UF_KV3
                          )
                        "
                        @change="
                          numberFix(
                            indicators.indicators.AMORTIZATION[tb.ID][
                              year.UF_YEAR
                            ],
                            'UF_KV3'
                          )
                        "
                        :disabled="editDisabled || year.KV3_IS_EDIT === 0"
                        type="text"
                        class="i-main-style"
                        v-model="
                          indicators.indicators.AMORTIZATION[tb.ID][
                            year.UF_YEAR
                          ].UF_KV3
                        "
                      />

Ответы (1 шт):

Автор решения: Mikalai Parakhnevich

Как вариант, можете воспользоваться методом - Number.prototype.toLocaleString() - который возвращает строку с языко-зависимым представлением числа.

Привожу небольшой пример компонента, который получает число в качестве v-model и преобразовывает это число в нужный вам формат с возможностью редактирования этого числа.

Принцип работы компонента: Определяем переменные необходимые для работы input:

data: () => {
   return {
    realNumber: 0, // будет содержать актуальное числовое значение
    indicatorChange: false, // индикатор редактирования поля
 }
},

Создаем вычисляемое свойство для v-model конкретного input:

computed: {
 modelNumber: {
  get() {
    return this.indicatorChange ? this.realNumber : this.realNumber.toLocaleString()
  },
  set(value) {
    this.realNumber = +value.replace(/\s/g, "")
    this.$emit('input', this.realNumber)
  },
},
},

, как видно из кода, мы опираемся на значение get вычисляемого свойства и получаем активное реальное значение числа(для редактирования) или отформатированного числа для отображения(для случая потери фокуса полем формы)

После этого, оформляем template компонента опираясь на созданные переменные:

<input
    :id="title"
    v-model="modelNumber"
    :type="indicatorChange ? 'number' : 'text'"
    @focus="indicatorChange = true"
    @blur="indicatorChange = false"
  />

, где type можно сделать динамическим и зависимым от статуса редактирования поля, чтобы подключить нативные возможности валидации браузера (ввод только чисел)

Каким-то образом это все похоже на танцы с бубном) но думаю - почерпнете для себя немного информации

Vue.component('numinput', {
  props: ['title', 'value'],
  data: () => {
    return {
      realNumber: 0,
      indicatorChange: false,
    }
  },
  computed: {
    modelNumber: {
      get() {
        return this.indicatorChange ? this.realNumber : this.realNumber.toLocaleString()
      },
      set(value) {
        this.realNumber = +value.replace(/\s/g, "")
        this.$emit('input', this.realNumber)
      },
    },
  },
  created() {
    this.realNumber = this.value || 1234567
  },
  template: `
    <div>
      <label :for="title">{{title}}</label>
      <input
        :id="title"
        v-model="modelNumber"
        :type="indicatorChange ? 'number' : 'text'"
        @focus="indicatorChange = true"
        @blur="indicatorChange = false"
      />
     </div>
  `
})


new Vue({
  el: '#app',
  data: () => {
    return {
      num1: 1000,
      num2: 150000,
      num3: 20000.444
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<div id="app">
  <form>
    <numinput title="num1" v-model.number="num1"></numinput>
    <numinput title="num2" v-model.number="num2"></numinput>
    <numinput title="num3" v-model.number="num3"></numinput>
  </form>
  <hr>
  <pre>
   Актуальные значения:
    num1 = {{ num1 }}
    num2 = {{ num2 }}
    num3 = {{ num3 }}
  </pre>
</div>

→ Ссылка