b-form-input格式化程序未格式化数字

时间:2020-07-12 06:13:21

标签: vue.js bootstrap-vue

我正在尝试在用户键入时以逗号分隔的方式显示输入数字。我正在使用bootstrap-vue的b-form-input。我相信格式化程序是正确的选择。当我使用格式化程序时,我没有看到预期的格式化结果。这是我的jsfiddle https://jsfiddle.net/spike_wood/34wqme5n/9/

**为澄清起见,目的是将变量点保留为数字,以进行数学运算等。目的是在数字很大时以可读的方式在输入字段中显示该数字。

<div id="app">
  <div>
    <b-form>
      <b-form-group
        label-for="totalPoints"
        description="Enter points."
      >
        <label for="totalPoints">Total Points</label>
        <b-input-group append="pts">
          <b-form-input
            style="width: 20%"
            id="totalPoints"
            v-model.number="points"
            placeholder="Enter your total points"
            :formatter="numberFormat"
          />
        </b-input-group>
      </b-form-group>
    </b-form>
    <h3>Unformatted Points: {{ points }}</h3>
    <h3>Formatted Points: {{ numberFormat(points) }}</h3>
  </div>
</div>

还有我的javascript:

  new Vue({
    el: '#app',
    data() {
      return {
        name: 'BootstrapVue',
        points: ''
      }
    },
    methods: {
        numberFormat(value) {
        return value === 0 ? '' : value.toLocaleString();
      }
    }
  })

如果我处理方法不正确,请通知我。

3 个答案:

答案 0 :(得分:0)

您需要分割字符串并用逗号将它们连接起来。

methods: {
    numberFormat(value) {
        return value.replace(/,/g, '').split('').join(',')
  }
}

但是上述情况将始终在每个字符串后添加逗号,并且在字符串中不接受逗号

答案 1 :(得分:0)

这是因为发送到格式化程序函数的值将始终是字符串,但是现在您正在检查数字。

因此,您需要执行此操作,以使格式化程序使用当前代码。

numberFormat(value) {
  return value === '0' ? '' : value.toLocaleString();
}


如果您希望将v-model值输出为数字,则也不应使用v-model.number,而应使用number道具。 (格式化程序仍然是字符串)

v模型修饰符.number和.trim可能会在用户键入时导致意外的光标跳转(这是自定义组件上的v模型的Vue问题)。避免使用这些修饰符。改用数字或修剪道具。

https://bootstrap-vue.org/docs/components/form-input#input-type(在 具有输入类型的注意事项 下)

答案 2 :(得分:0)

根据从Hiws答案中学到的知识,我为该字段创建了一个显示字符串,并创建了一个变量以捕获实际数字。这样我就可以在具有可读格式的情况下对数字进行数学运算。

我的脚本现在如下所示。我还在return语句中移到了类型强制转换运算符,以从输入字段中仅删除0个字符串

new Vue({
    el: '#app',
    data() {
      return {
        points: 0,
        displayPoints: ''
      }
    },
    methods: {
      numberFormat(value) {
        this.points = Number(value.replace(/\D/g, ''))
        return value == '0' ? '' : this.points.toLocaleString();
      }
    }
  })

我的html如下所示。我从输入中删除了所有数字转换,因为它与我插入的逗号不太匹配。

<div id="app">
  <div>
    <b-form>
      <b-form-group
        label-for="totalPoints"
        description="Enter points."
      >
        <label for="totalPoints">Total Points</label>
        <b-input-group append="pts">
          <b-form-input
            style="width: 20%"
            id="totalPoints"
            v-model="displayPoints"
            placeholder="Enter your total points"
            :formatter="numberFormat"
          />
        </b-input-group>
      </b-form-group>
    </b-form>
    <h3>Unformatted Points: {{ points }}</h3>
    <h3>Formatted Points: {{ displayPoints }}</h3>
    <h3>Math on Points: {{ points + points }}</h3>
  </div>
</div>