【问题标题】:Regular Expression for dollar amount in JavaScriptJavaScript中美元金额的正则表达式
【发布时间】:2016-10-05 00:30:50
【问题描述】:

我知道这已经做过一千次了,但我很难做到这一点。我需要为美元金额格式化文本输入的值。不允许使用逗号。只允许保留两位小数。 应允许的示例:

  • 100
  • 100.10
  • 100 美元
  • 100.25 美元

以下是我目前不完整的正则表达式。它目前允许在任何地方包含多个美元符号(不仅仅是在开始时),在任何地方包含多个小数点,并且不应该包含两个以上的小数位。

<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript" language="Javascript">
    $(function(){

        jQuery('.dollarAmountOnly').keyup(function () {
            this.value = this.value.replace(/[^$0-9\.]/g, '');
        });
    });
</script>
</head>
<body>
<input type="text" class="dollarAmountOnly"/>
</body>
</html>

非常感谢您的帮助。谢谢!

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    编辑

    抱歉,您的问题明确要求精确到小数点后两位。这就是你想要的:

    var r = /^\$?[0-9]+(\.[0-9][0-9])?$/;
    
    console.log(r.test("12.55"));  //true
    console.log(r.test("$12.55"));  //true
    console.log(r.test("$12"));     //true
    
    console.log(r.test("$12."));    //false
    console.log(r.test("$12.2"));    //false
    console.log(r.test("$$12"));     //false
    console.log(r.test("$12.555")); //false
    

    你必须转义你的美元符号,然后你想要小数点后的两个选项数字:

    var r = /^\$?[0-9]+\.?[0-9]?[0-9]?$/;
    
    console.log(r.test("12.55"));  //true
    console.log(r.test("$12.55"));  //true
    console.log(r.test("$12."));    //true
    console.log(r.test("$12"));     //true
    
    console.log(r.test("$$12"));     //false
    console.log(r.test("$12.555")); //false
    

    Fiddle

    或者,要允许小数点后的任意数字,您可以使用 Kleene 闭包而不是两个可选数字

    var r = /^\$?[0-9]+\.?[0-9]*$/;
    
    console.log(r.test("12.55"));  //true
    console.log(r.test("$12.55"));  //true
    console.log(r.test("$12."));    //true
    console.log(r.test("$12"));     //true
    console.log(r.test("$12.555")); //true
    
    console.log(r.test("$$12"));     //false
    

    【讨论】:

    • 感谢您的回复。我试过你的正则表达式,但它仍然允许多个美元符号。
    • @SquidScareMe - 你确定吗?两个美元符号对我来说失败了
    • @AdamRackis 提问者也希望不需要 $,但最多允许一个 {0,1} 可以工作,是吗?
    • 由于某种原因,当我插入您的第一个正则表达式时,所有输入都是允许的。不知道出了什么问题。
    • @SquidScareMe - 我的荣幸 :)
    【解决方案2】:

    对于我们这些想要允许逗号的人,这里是正则表达式:

    /^\$?\d+(,\d{3})*\.?[0-9]?[0-9]?$/
    

    如果您实际上并不想要它们,我主张允许它并删除后端的逗号。任何让用户更容易的东西。 Jakob Nielson discusses cumbersome forms at point #7.

    【讨论】:

    • 略有改进,这允许使用小数位,但如果输入句点,则需要在句点后有两个位置:/^\$?\d+(,\d{3})*(\.[0-9]{2})?$/ 这是你的组合和我一直使用的另一个虽然我相信我也在 Stack Overflow 上的某个地方找到了。
    • @user2449231 这是一个很棒的!您可以在添加允许逗号的情况下发布此内容吗?
    【解决方案3】:

    我建议不要在.keyup 上进行验证(即在用户键入时),而是在用户提交表单时进行。

    然后,您可以验证dollarAmountOnly 文本框是否匹配正确的正则表达式,而不是替换无效字符。

    有效价格的正则表达式是(允许尾随/前导空格):

    /^ *\$?\d+(?:\.\d{2})? *$/g
    

    因此,当用户按下提交时,您会查看正则表达式是否匹配 dollarAmountOnly,如果不匹配,则以某种方式让用户知道。

    【讨论】:

    • 感谢您的回复。不幸的是,要求是在用户输入时进行验证。
    • 如果您有兴趣,有一项关于 A List Apart 的研究,其中包括 when to validate when doing inline validation。只是说“不要在 keyup 上做”有点过于简单化了。他们发现最好在短暂的延迟后打开按键。
    【解决方案4】:

    这是我用来在 javascript 中识别各种货币的正则表达式:

     _this.currencyRegex = /^(\$|\€\£|\₪|)(?!0\.00)\d{1,3}(,\d{3})*(\.\d\d)?$/;
    

    一个很好的调试工具:

    https://regex101.com/r/hL2pF2/26

    【讨论】:

      猜你喜欢
      • 2011-03-12
      • 2020-10-09
      • 2013-07-25
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      相关资源
      最近更新 更多