VueJs 自定义货币掩码
VueJs Custom currency mask
我的货币掩码有一些问题。
当我在字段中输入 10000
时,它会按预期设置格式 10,000
但是当我将焦点转移到另一个字段或按 Tab 键时。掩码将逗号位置向左移动 1。即 10,000
变为 1,0000
你可以检查 codepan 来解决这个问题,谁能帮我解决这个问题?
https://codepen.io/veer3383/pen/BxqzLb?editors=1010#
模板:
<v-text-field @keyup="formatCurrency(initialBalance, $event)" :prefix="currency" v-model="initialBalance" label="Balance" :disabled="disabled"></v-text-field>
方法:
formatCurrency (num: any, e: any) {
num = num + '';
var number = num.replace(/[^\d.-]/g, '');
var splitArray = number.split('.');
var integer = splitArray[0];
var mantissa = splitArray.length > 1 ? '.' + splitArray[1] : '';
var rgx = /(\d+)(\d{3})/;
while (rgx.test(integer)){
integer = integer.replace(rgx, '' + ',' + '');
}
e.currentTarget.value = integer + mantissa.substring(0, 3);
},
您不需要 keyup
和 v-model
,它们最终可能会造成冲突。我发现使用计算值(或带有格式化版本的手表)更容易。
模板:
<div id="app">
<v-app id="inspire">
<v-form ref="form" v-model="valid" lazy-validation>
<v-flex lg3="">
<v-text-field :prefix="currency" v-model="initialBalanceFormatted" label="Balance" :disabled="disabled"></v-text-field>
</v-flex>
</v-form>
</v-app>
</div>
脚本:
function formatAsCurrency (value, dec) {
dec = dec || 0
if (value === null) {
return 0
}
return '' + value.toFixed(dec).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, ",")
}
new Vue({
el: '#app',
data: () => ({
valid: true,
disabled: false,
currency: "£",
initialBalance: null,
}),
computed: {
initialBalanceFormatted: {
get: function() {
return formatAsCurrency(this.initialBalance, 0)
},
set: function(newValue) {
this.initialBalance = Number(newValue.replace(/[^0-9\.]/g, ''));
}
}
}
})
如果您有不止一个或两个,将这些输入转换为单独的(可重复使用的)组件会很有帮助。
这是我前段时间做的一个例子,它使用可以处理其他类型(如百分比)的组件,仅在模糊后才进行格式化(因此您的逗号不会跳跃)并允许使用向上和向下键 increment/decrement
我的货币掩码有一些问题。
当我在字段中输入 10000
时,它会按预期设置格式 10,000
但是当我将焦点转移到另一个字段或按 Tab 键时。掩码将逗号位置向左移动 1。即 10,000
变为 1,0000
你可以检查 codepan 来解决这个问题,谁能帮我解决这个问题?
https://codepen.io/veer3383/pen/BxqzLb?editors=1010#
模板:
<v-text-field @keyup="formatCurrency(initialBalance, $event)" :prefix="currency" v-model="initialBalance" label="Balance" :disabled="disabled"></v-text-field>
方法:
formatCurrency (num: any, e: any) {
num = num + '';
var number = num.replace(/[^\d.-]/g, '');
var splitArray = number.split('.');
var integer = splitArray[0];
var mantissa = splitArray.length > 1 ? '.' + splitArray[1] : '';
var rgx = /(\d+)(\d{3})/;
while (rgx.test(integer)){
integer = integer.replace(rgx, '' + ',' + '');
}
e.currentTarget.value = integer + mantissa.substring(0, 3);
},
您不需要 keyup
和 v-model
,它们最终可能会造成冲突。我发现使用计算值(或带有格式化版本的手表)更容易。
模板:
<div id="app">
<v-app id="inspire">
<v-form ref="form" v-model="valid" lazy-validation>
<v-flex lg3="">
<v-text-field :prefix="currency" v-model="initialBalanceFormatted" label="Balance" :disabled="disabled"></v-text-field>
</v-flex>
</v-form>
</v-app>
</div>
脚本:
function formatAsCurrency (value, dec) {
dec = dec || 0
if (value === null) {
return 0
}
return '' + value.toFixed(dec).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, ",")
}
new Vue({
el: '#app',
data: () => ({
valid: true,
disabled: false,
currency: "£",
initialBalance: null,
}),
computed: {
initialBalanceFormatted: {
get: function() {
return formatAsCurrency(this.initialBalance, 0)
},
set: function(newValue) {
this.initialBalance = Number(newValue.replace(/[^0-9\.]/g, ''));
}
}
}
})
如果您有不止一个或两个,将这些输入转换为单独的(可重复使用的)组件会很有帮助。
这是我前段时间做的一个例子,它使用可以处理其他类型(如百分比)的组件,仅在模糊后才进行格式化(因此您的逗号不会跳跃)并允许使用向上和向下键 increment/decrement