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

标签 jquery

我在制作 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, ",")在适当的位置插入逗号

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

Here is a fiddle

最佳答案

好的,感谢@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/

相关文章:

jquery - Sharepoint Angular REST 添加项目产量 400(错误请求)

javascript - .one() jQuery 函数自动多次引发

php - jQuery AJAX 数据类型 html 使用

javascript - JQuery datepicker 方法不适用于重复元素

php - 如何在组件中保持页眉和页脚相同,内容将发生变化

php - 如何将 append 输入字段数据插入到 mySQL 数据库?

javascript - 如何计算有多少元素具有某个类

javascript - 向列表项添加 anchor 标记会使列表项消失?

javascript - 如何在所有类型的浏览器中禁用 HTML 5 Video Player 全屏按钮,尤其是在 IE、Edge 和 Firefox、Opera、Safari 中?

javascript - 如何让 Youtube 视频在页面刷新时继续播放