我遇到了一个jQuery脚本问题,该脚本用于将货币输入格式化为正确的2个小数位和一个1000的逗号。它在chrome中完美运行,但是当我在Edge中进行测试时,控制台日志显示“意外量词”错误,而在Firefox中,控制台显示“无效正则表达式组”错误。
以下是引发错误的行:
return value.replace(/(?!\.)\D/g, "").replace(/(?<=\..*)\./g, "").replace(/(?<=\.\d\d).*/g, "").replace(/\B(?=(\d{3})+(?!\d))/g, ",");
这是完整功能:
$('#sg-amount').on('change click keyup input paste',(function (event) {
$(this).val(function (index, value) {
return value.replace(/(?!\.)\D/g, "").replace(/(?<=\..*)\./g, "").replace(/(?<=\.\d\d).*/g, "").replace(/\B(?=(\d{3})+(?!\d))/g, ",");
});
}));
编辑
这个问题与其他问题有所不同,因为它做了几件事:
1.添加逗号
2.允许小数
3.将小数位限制为2位数字。
4.是否全部在Keyup上
我在stackoverflow上发现的其他解决方案并不能解决所有这些问题。 我想继续使用jQuery,并且不想使用Javascript。我喜欢这段代码的简单性,并且不希望使用500行代码来使其正常工作。
它在chrome中完美运行,但在Edge或Firefox中不起作用。我还没有尝试过其他浏览器。
编辑2
根据下面的评论,也许这对我会有更多帮助。这是我希望每次替换完成的操作:
.replace(/(?!\.)\D/g, "")
删除所有非数字字符。
.replace(/(?<=\..*)\./g, "")
删除所有多余的。除了第一个。
.replace(/(?<=\.\d\d).*/g, "")
删除小数点后2位的所有内容
.replace(/\B(?=(\d{3})+(?!\d))/g, ",")
在适当的位置插入逗号
由于其中某些调用在某些浏览器中导致错误,因此在跨浏览器友好的每次替换中,是否都可以使用更好的字符串?
答案 0 :(得分:3)
好吧,感谢@ zer00ne和他的评论,今天我学到了一些。首先,ES2018:RegExp向后断言已在Chrome中实现,并且Edge和Firefox目前正在进行中,但尚不支持。因此,我进行了一些挖掘,发现例如表达式?<=
引发错误,因此我可以将其替换为?:
更改后我无法使用的另一个表达式是.replace(/(?<=\.\d\d).*/g, "")
,删除小数点后2位后的所有内容。因此,我将其替换为以下表达形式:.replace(/\.(\d\d)\d?$/, '.$1')
,就成功了!
因此,这里就是解决方法!
$('#sg-amount').on('change click keyup input paste',(function (event) {
$(this).val(function (index, value) {
return value.replace(/(?!\.)\D/g, "").replace(/(?:\..*)\./g, "").replace(/\.(\d\d)\d?$/, '.$1').replace(/\B(?=(\d{3})+(?!\d))/g, ",");
});
}));
我已经更新了小提琴以反映这些变化。
Fiddle