【问题标题】:Regex for number with decimals and thousand separator带有小数和千位分隔符的数字的正则表达式
【发布时间】:2013-04-15 09:49:41
【问题描述】:

我需要正则表达式来使用 javascript 验证可能包含千位分隔符或小数的数字。 最大值为9,999,999.99 最小值0.01 其他有效值: 11,111 11.1 1,111.11

无效值: 1111 1111,11 ,111 111,

我无所事事地找遍了。

【问题讨论】:

    标签: javascript regex decimal


    【解决方案1】:
    /^\d{1,3}(,\d{3})*(\.\d+)?$/
    

    关于最小值和最大值...好吧,我不会使用正则表达式,但您可以在开头添加前瞻:

    /^(?!0+\.00)(?=.{1,9}(\.|$))\d{1,3}(,\d{3})*(\.\d+)?$/
    

    注意:这允许0,999.00,因此您可能需要将其更改为:

    /^(?!0+\.00)(?=.{1,9}(\.|$))(?!0(?!\.))\d{1,3}(,\d{3})*(\.\d+)?$/
    

    这不允许前导 0。

    编辑:
    测试:http://jsfiddle.net/pKsYq/2/

    【讨论】:

    • 感谢您的快速回复 Loamhoof 虽然不高兴。我这样称呼它,但它失败了: var re = new RegExp("/(?!0+\.00)(?!.{10,}\.)(?!0,?\d)\d {1,3}(,\d{3})*\.\d+/"); if (!min.match(re)) { alert('No match'); }
    • @Swifty 你能给我一个失败的例子吗?
    • 我正在使用这个页面来测试它:Regular Expression Tester 如果我输入 '1' 会失败。
    • @Swifty 我的错,我认为小数是必需的。我正在改变它。
    • @RyanDaulton 该问题指定的最大值为9,999,999.99,低于10,029,589.84
    【解决方案2】:
    ((\d){1,3})+([,][\d]{3})*([.](\d)*)?
    

    它适用于一些,但我仍在学习正则表达式。

    逻辑应该是 1-3 位 0-1 次,1 个逗号后跟 3 位任意次数,以及单个 .后跟任意位数 0-1 次

    【讨论】:

    • 蒙克也没有快乐。
    • 你能给出失败的案例吗?
    • 已编辑,应该是 + 而不是 ?对于第一个子表达式。
    • 以某种方式返回所有内容为有效?
    • @Swifty * 和 ?等于可选,并且 \d{1,3}+ 等于至少 1 位。不用^和$括起来,相当于“包含至少1位”
    【解决方案3】:

    Tezra 的公式对于“1”无效。或“1.0”。出于我的目的,我允许前导零和尾随零,以及前导 + 或 - 号,如下所示:

    ^[-+]?((\d{1,3}(,\d{3})*)|(\d*))(\.|\.\d*)?$
    

    【讨论】:

      【解决方案4】:

      首先,我想指出,如果您拥有数据来自的表单,限制输入的最佳方法是使用正确的表单元素(又名数字字段)

      <input type="number" name="size" min="0.01" max="9,999,999.99" step="0.01">
      

      是否可以输入“,”将取决于浏览器,但浏览器始终会将值作为实际数字提供给您。 (请记住,所有表单数据也必须在服务器端进行验证/清理。永远不要相信客户端)


      其次,我想将其他答案扩展到更强大(独立于平台)/可修改的正则表达式。

      • 您应该用 ^ 和 $ 将正则表达式括起来,以确保您匹配的是整个数字,而不仅仅是它的子集。前^&lt;my_regex&gt;$
      • 小数的右边是可选的,所以我们可以把它放在一个可选组(&lt;regex&gt;)?
      • 匹配文字句点而不是任何数字链只是\.\d+
        • 如果你想坚持小数点后的最后一个数字不是0,你可以使用[1-9]作为“非零数字”所以\.\d+[1-9]
      • 对于小数的左侧,前导数字将非零,或者数字为零。所以([1-9]&lt;rest-of-number-regex&gt;|0)
      • 第一组数字将是 1-3 位数字,所以 [1-9]\d{0,2}
      • 之后,我们必须在 3s 中添加数字所以(,\d{3})*
        • 还记得吗?表示可选,所以要使 , 可选只是 (,?\d{3})*

      把它们放在一起

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

      【讨论】:

        【解决方案5】:

        我使用下面的正则表达式来进行以下限制 -

        ^(?!0|\.00)[0-9]+(,\d{3})*(.[0-9]{0,2})$
        
        1. 不允许 0 和 .00。
        2. ','(千位分隔符)后 3 位。
        3. '.' (小数点到小数点后 2 位)。

        【讨论】:

          【解决方案6】:

          在最近的一个项目中,我们需要更改此版本以满足国际要求。 这是我们使用的:^-?(\d{1,3}(?&lt;tt&gt;\.|\,| ))((\d{3}\k&lt;tt&gt;)*(\d{3}(?!\k&lt;tt&gt;)[\.|\,]))?\d*$

          创建一个命名组 (?&lt;tt&gt;\.|\,| ) 允许我们稍后使用负前瞻 (?!\k&lt;tt&gt;)[\.|\,]) 来确保千位分隔符和小数点实际上不同。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多