我在制作 jQuery 脚本时遇到了问题,该脚本用于将货币输入格式化为正确的 2 位小数和 1,000 的逗号。它在 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, ",")
在适当的位置插入逗号
由于其中一些调用在某些浏览器中导致错误,因此在每个替换中是否有更好的跨浏览器友好的字符串?
最佳答案
好的,感谢@zer00ne 和他的评论,我今天学到了一些东西。首先,ES2018:RegExp Lookbehind 断言已在 Chrome 中实现,目前正在 Edge 和 Firefox 中实现,但尚未得到支持。所以我做了一些挖掘,发现例如表达式 ?<=
抛出一个错误,我可以将其替换为 ?:
更改后我无法开始工作的另一个表达式是 .replace(/(?<=\.\d\d).*/g, "")
删除小数点后两位后的所有内容。所以我用这个表达式替换它:.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 以反射(reflect)这些变化。
Fiddle
关于jQuery,格式化美元金额输入时出现控制台错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52489824/