jQuery,格式化美元金额输入时出现控制台错误

时间:2018-09-25 02:38:41

标签: jquery

我遇到了一个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, ",")在适当的位置插入逗号

由于其中某些调用在某些浏览器中导致错误,因此在跨浏览器友好的每次替换中,是否都可以使用更好的字符串?

Here is a fiddle

1 个答案:

答案 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