Javascript中货币掩码期间的额外数字



我正在尝试在不使用jquery插件的情况下为货币掩码创建一个快速函数。我所处的环境正在使用requirejs,任何添加插件的尝试通常都会导致此问题:

不匹配的匿名定义(( 模块

无论如何,这是我下面的代码,我试图摆脱小数点后的第 3 位数字,以便小数点后只有 2 位数字,但终生我无法弄清楚为什么我所做的一切都不会让它消失。

currencyMask("#test");
function currencyMask(fieldID) {
$(fieldID).on('keypress click', function() {
if (this.value != '') {
if (this.value.length == 1) {
this.value = '0' + this.value
}

this.value = parseFloat(this.value.replace(/[^d]/g, '').replace(/(dd?)$/, '.$1')).toFixed(2).replace(/(d)(?=(ddd)+(?!d))/g, '$1,').replace(/(d{2})(d$)/, '$1');
}
});
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<input id='test'>

经过一些讨论,一些测试和一些研究。我稍微更改了我的代码并解决了 Kevin B 提到的关于keyupkeypress的问题。

经过一些研究,似乎keypress在"按下键"时触发,而keyup在"释放密钥"时触发。-W3学校

正因为如此,我选择了keyup

此外,凯文B说:

让整个事情变得奇怪的是,当你的代码对输入做任何事情时,你就在最后一个位置键入,因为你完全替换了这个值。

所以我更改了代码,以便用户在开头而不是结尾键入。他还提到:

无论您如何更改值,如果在输入仍聚焦时更改它,它都会影响输入的可用性,因为它会以某种方式更改插入点。我更喜欢事后更改它,而不是为了不干扰用户的输入而生活。例如,在模糊中。

这里的这部分绝对是偏好。我刚才把一个管理员带到我的办公桌前,问他们更喜欢哪一个。他们中的大多数人不喜欢事后改变的那些。他们发现这令人困惑,对他们来说,货币掩码的全部意义在于清楚地看到他们在输入时正在输入的内容。

需要明确的是,没有"错误"的方法可以做到这一点。你可以做.blur,这也有效。这更多的是关于我们的特定用户喜欢什么。

这是我在下面更新的代码:

currencyMask("#test");
function currencyMask(fieldID) {
$(fieldID).keyup(function() {
if (this.value != '' && this.value.length >= 3) {
this.value = this.value.replace(/[^d]/g, '').replace(/(d{2}$)/, '.$1').replace(/(d)(?=(ddd)+(?!d))/g, '$1,');
}
});
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<input id='test'>

最新更新