带有小数和千位分隔符的数字的正则表达式

时间:2013-04-22 13:13:57

标签: javascript regex decimal

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

INVALID值: 1111 1111,11 ,111 111,

我一直在搜索,没有任何快乐。

6 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:2)

((\d){1,3})+([,][\d]{3})*([.](\d)*)?

它有一些,但我仍然在学习正则表达式。

逻辑应为1-3位0-1次,1个逗号后跟3位数任意次,并且单个。后跟任意数字的数字0-1次

答案 2 :(得分:1)

我使用以下regrex进行以下限制 -

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

答案 3 :(得分:0)

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

创建命名组(?<tt>\.|\,| )允许我们稍后使用否定的外观(?!\k<tt>)[\.|\,]),以确保千位分隔符和小数点实际上不同。

答案 4 :(得分:0)

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

<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}
  • 此后,我们必须在3秒钟内添加数字,因此(,\d{3})*
    • 还记得吗?表示可选,因此使可选只是(,?\d{3})*

将它们放在一起

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

答案 5 :(得分:0)

Tezra的公式对于“ 1”失败。或“ 1.0”。就我的目的而言,我允许前导和尾随零,以及前导+或-号,例如:

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