gpt4 book ai didi

javascript - vue js的数字输入组件

转载 作者:搜寻专家 更新时间:2023-10-30 22:47:40 29 4
gpt4 key购买 nike

这是我使用 Numeral.js 实现的:

        Vue.filter('formatNumber', function (value) {
return numeral(value).format('0,0.[000]')
})

Vue.component('input-number', {
template: '\
<div>\
<label v-if="label">{{ label }}</label>\
<input\
ref="input"\
v-bind:value="displayValue(value)"\
v-on:input="updateValue($event.target.value)"\
v-on:focus="selectAll"\
>\
</div>\
',
props: {
value: {
},
label: {
}
},
methods: {
updateValue: function (inputValue) {

var valToSend = inputValue

var numVal = numeral(valToSend).value()

if (isNaN(numVal)) {
valToSend = this.value.toString()
numVal = numeral(valToSend).value()
}

var formattedVal = numeral(numVal).format('0,0.[000]')

this.$refs.input.value = formattedVal + (valToSend.endsWith('.') ? '.' : '')

this.$emit('input', numeral(formattedVal).value())


},
displayValue: function (inputValue) {
return numeral(inputValue).format('0,0.[000]')
},
selectAll: function (event) {
// Workaround for Safari bug
// http://stackoverflow.com/questions/1269722/selecting-text-on-focus-using-jquery-not-working-in-safari-and-chrome
setTimeout(function () {
event.target.select()
}, 0)
}
}
})
var app = new Vue({
el: '#app',
data: {
pricePerGram: '160000',
weightInGrams: '1.5',
},
computed: {
totalPrice: function () {
return (this.pricePerGram * this.weightInGrams)
},
toatlWithVat: function () {
return (this.totalPrice *1.09)
}
}
})
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/numeral.js/2.0.6/numeral.min.js"></script>

<div id="app">
<input-number v-model="pricePerGram" label="Price per gram:"></input-number><br />
<input-number v-model="weightInGrams" label="Weight in grams:"></input-number><br />
<div><label>Total price: </label><span dir="ltr">{{totalPrice | formatNumber}}</span></div><br />
<div><label>Total + Vat: </label><span dir="ltr">{{toatlWithVat | formatNumber}}</span></div><br />
</div>

我做的对吗?有没有更好的方法来实现纯数字输入?

我正在寻求改进这一点。使用 Numeral.js 不是强制性的。这只是我找到的一个图书馆。

关于当前实现的一些事情:

  • 支持千位分隔符(在您键入时)。

  • 支持 3 位小数点(我想对此进行改进并接受无限数量的小数位。这是因为这种格式 0,0.[000]。我找不到任何格式接受 Numeral.js 的无限十进制数字)

  • 只接受数字、逗号和点(不允许使用任何字符)。

    我还可以使用正则表达式代替 Numeral.js。这可以改进吗?

最佳答案

这应该有效( Codepen ):

Vue.component("input-number", {
template: '<input type="string" v-model="model">',

props: {
value: {
type: String,
required: true,
}
},

computed: {
model: {
get() {
// We extract decimal number, beacause toLocaleString will automagically
// remove the dot and zeros after it while the user is still typing
let value = this.value.split(".");
let decimal = typeof value[1] !== "undefined"
? "." + value[1]
: "";

return Number(value[0]).toLocaleString("en-GB") + decimal;
},

set(newValue) {
this.$emit("input", newValue.replace(/,/g, ""));
}
}
}
});

new Vue({
el: "#app",
data: {
input: "1234567.890",
}
});

关于javascript - vue js的数字输入组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49712404/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com