20

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

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

我没有快乐地到处寻找。

4

6 回答 6

28
/^\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/

于 2013-04-22T13:24:18.850 回答
3
((\d){1,3})+([,][\d]{3})*([.](\d)*)?

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

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

于 2013-04-22T13:31:20.863 回答
2

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

^[-+]?((\d{1,3}(,\d{3})*)|(\d*))(\.|\.\d*)?$
于 2018-12-07T16:46:55.703 回答
1

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

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

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


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

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

把它们放在一起

^([1-9]\d{0,2}(,?\d{3})*|0)(\.\d+[1-9])?$
于 2018-11-09T15:19:41.753 回答
1

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

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

于 2018-11-09T14:04:59.813 回答
0

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

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