所有数字和小数点格式的Javascript Regexp

所有数字和小数点格式的Javascript Regexp,javascript,regex,Javascript,Regex,我想做一个javascript验证,它将接受所有数字和小数点格式 例如: 1000000.00还可以 1.000.000,00可以 1.000000.00不正常 1.00000000不正常 1000.000,00不正常 1000.000.00不合适 根据我在这里得到的信息: /^[1-9][0-9]{0,2}(,[0-9]{3})*(\[0-9]{2})$/仅对1000000.00有效,对1.000.000,00无效 如何验证这两种格式 更新: 如果1000分不是强制性的,例如: 1000000

我想做一个javascript验证,它将接受所有数字和小数点格式

例如:
1000000.00还可以
1.000.000,00可以

1.000000.00不正常
1.00000000不正常
1000.000,00不正常
1000.000.00不合适

根据我在这里得到的信息:
/^[1-9][0-9]{0,2}(,[0-9]{3})*(\[0-9]{2})$/
仅对1000000.00有效,对1.000.000,00无效

如何验证这两种格式

更新:

如果1000分不是强制性的,例如:
1000000.00可以或
1000000,00是可以的

最简单的方法(尽管不是目前为止最优雅的)是为另一种情况编写类似的RE,并用“OR”连接它们,如下所示:

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

一个稍微整理过的版本

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

这是你想要的正则表达式

^(([1-9]\d{0,2}(((\.\d{3})*(,\d{2})?)|((,\d{3})*(\.\d{2})?)))|(0(\.|,)\d{1,2})|([1-9]\d+((\.|,)\d{1,2})?))$
这是证明它可以处理所有案件的链接


您可以将
\.
替换为
[,.]
,以在任一位置接受。但它也会使
1000.000.00
正常

在JavaScript中很难让regexp像这样运行,因为不能使用lookbehinds

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

/^      #anchor to the first char of string
(       #start group
  0       # 0
|       # or
  0[.,]   # 0 or 0 followed by a . or ,
  \d{2}   # 2 digits
|       # or
  [1-9]   #match 1-9
  \d{0,2} #0-2 additional digits
  (       #start group
    (,(\d{3}))* # match , and 3 digits zero or more times
    (\.\d{2})?  # match . and 2 digits zero or one
  |       # or
    (\.(\d{3})* # match . and 3 digits zero or more times
    (,\d{2})?   # match , and 2 digits zero or one time
  )       #end group
)       #end group
$/      #anchor to end of string

假设小数部分和千位分隔符是必需的,而不是可选的,并且0不是允许的值(如示例和正则表达式所示):

作为详细的正则表达式:

^              # Start of string
[1-9]\d{0,2}   # 1-3 digits, no leading zero
(?:            # Match either...
 (?:,\d{3})*   # comma-separated triple digits
 \.\d{2}       # plus dot-separated decimals
|              # or...
 (?:\.\d{3})*  # dot-separated triple digits
 ,\d{2}        # plus comma-separated decimals
)              # End of alternation
$              # End of string

查看这么大的正则表达式的最好方法是将其放大到 一个非常大的字体,并在备选字体上拆分(|)

总而言之,这是个畜生-

function validDelimNum2(s){
var rx=/(^\d+([,.]\d+)?$)|((^\d{1,3}(,\d{3})+(\.\d+)?)$)|((^\d{1,3}(\.\d{3})+(,\d+)?)$)/;
return rx.test(s);
}
//测试

var N= [
'10000000',
    '1,000,000.00',
    '1.000.000,00',
    '1000000.00',
    '1000000,00',
    '1.00.00',
    '1,00,00',
    '1.000,00',
    '1000,000.00'
]
var A= [];
for(var i= 0, L= N.length; i<L; i++){
    A.push(N[i]+'='+validDelimNum2(N[i]));
}
A.join('\n')

/*  returned values
10000000=true
1,000,000.00=true
1.000.000,00=true
1000000.00=true
1000000,00=true
1.00.00=false
1,00,00=false
1.000,00=true
1000,000.00=false
*/
var N=[
'10000000',
'1,000,000.00',
'1.000.000,00',
'1000000.00',
'1000000,00',
'1.00.00',
'1,00,00',
'1.000,00',
'1000,000.00'
]
var A=[];

对于(var i=0,L=N.length;这不是@Siwan想要的,这是他已经拥有的(只是缩短了);但是他的版本更具体(见第一位数字和十进制数字)@Gursel Koca,如果我使用该regexp,0有效吗?如果我验证1000有效吗?这也有效吗?:)它不应该有效,应该写为1000。或者你应该说逗号不是强制性的。@siwan,我已经纠正了。您可以使用第一个正则表达式。但逗号或圆点是强制性的是的,可以。谢谢mkilmanas,但还有其他较短的方法吗?:)
function validDelimNum2(s){
var rx=/(^\d+([,.]\d+)?$)|((^\d{1,3}(,\d{3})+(\.\d+)?)$)|((^\d{1,3}(\.\d{3})+(,\d+)?)$)/;
return rx.test(s);
}
var N= [
'10000000',
    '1,000,000.00',
    '1.000.000,00',
    '1000000.00',
    '1000000,00',
    '1.00.00',
    '1,00,00',
    '1.000,00',
    '1000,000.00'
]
var A= [];
for(var i= 0, L= N.length; i<L; i++){
    A.push(N[i]+'='+validDelimNum2(N[i]));
}
A.join('\n')

/*  returned values
10000000=true
1,000,000.00=true
1.000.000,00=true
1000000.00=true
1000000,00=true
1.00.00=false
1,00,00=false
1.000,00=true
1000,000.00=false
*/