Regex表示带小数和千位分隔符的数字

Regex for number with decimals and thousand separator

本文关键字:千位 分隔符 数字 表示 小数 Regex      更新时间:2023-09-26

我需要regex来验证一个可以使用javascript包含千个分隔符或小数的数字。最大值为9,999,999.99最小值0.01其他有效值:11,11111.11,111.11

无效值:11111111,11,111111,

我到处找都找不到。

/^'d{1,3}(,'d{3})*('.'d+)?$/

关于最小值和最大值。。。好吧,我不会用正则表达式来做,但你可以在开头添加lookahead:

/^(?!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/

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

它在一些方面起了作用,但我仍在学习regex。

逻辑应该是1-3位数字0-1次,1个逗号后面跟着3位数字任意次数,并且是单个。后面跟着任意数量的数字0-1倍

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

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

是否可以输入","将取决于浏览器,但浏览器将始终以实际数字的形式为您提供值。(请记住,所有表单数据也必须在服务器端进行验证/消毒。永远不要信任客户端(


其次,我想扩展一个更健壮(独立于平台(/可修改的regex的其他答案。

  • 您应该用^和$将正则表达式括起来,以确保与整个数字匹配,而不仅仅是它的子集。例如^<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])?$

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

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

Tezra的公式在"1."或"1.0"时失败。出于我的目的,我允许前导和尾随零,以及前导+或-符号,如下所示:

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

我已经使用下面的reglex进行以下重试-

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