Vuetify 2结合v-mask实现美国货币掩码遇解析错误求助
解决Vuetify 2中v-mask货币千分位掩码解析错误问题
你的问题核心是两个关键点:
type="number"会让浏览器强制校验输入为纯数字,带千分位逗号的字符串不符合number类型的解析规则,直接触发报错。- 固定长度的掩码
'###,###,###,###,###.##'会在数值未填满格式长度时生成多余的逗号(比如758,850,000,),进一步加剧解析错误。
简便解决方案
替换输入类型为text
将type="number"改为type="text",避免浏览器对非纯数字格式的输入做强制校验,让v-mask全权处理格式控制。使用动态千分位掩码
把v-mask配置改成'#,###.##',这个掩码会自动为任意长度的整数部分添加千分位逗号,无需固定分组数,既能覆盖几万到千亿的数值范围,又不会生成多余的逗号。
如果不需要强制保留两位小数(允许输入整数),可以改用可选小数的掩码:'#,###(.##)?'。补充验证规则(可选)
因为输入类型改为text,建议添加正则规则确保输入是合法的货币格式,避免无效输入。
修改后的代码示例
<v-text-field v-model="totalDollarAmount" v-mask="'#,###.##'" label="(4) Total Dollar Amount" type="text" prefix="$" outlined required :rules="[ (v) => !!v || 'Total Dollar Amount is required', (v) => { const cleanVal = v.replace(/^\$/, ''); return /^\d+(,\d{3})*(\.\d{2})?$/.test(cleanVal) || 'Please enter a valid currency amount'; } ]" :error-messages="totalDollarAmountWarning" ></v-text-field>
额外说明
如果需要将格式化后的字符串转换为数字用于提交,只需简单处理即可:
// 去除$和逗号后转换为数字 const numericValue = parseFloat(this.totalDollarAmount.replace(/[$,]/g, ''));
内容的提问来源于stack exchange,提问作者Qiuzman
相关产品推荐
相关产品推荐

