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

时间:2011-06-10 11:18:30

标签: javascript regex

我想进行javascript验证,接受所有数字和小数点格式。

例如:
1,000,000.00可以 1.000.000,00没问题

1.000,000.00不行。
1.000,000,00不行。
1,000.000,00不行。
1,000.000.00不行

基于我在这里得到的是:
/^[1-9][0-9]{0,2}(,[0-9]{3})*(\.[0-9]{2})?$/仅对1,000,000.00有效,不适用于1.000.000,00

我如何验证两种格式?

已更新:

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

5 个答案:

答案 0 :(得分:2)

这是你想要的正则表达式..

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

这是证明它可以处理所有案件的链接

http://regexr.com?2tves

答案 1 :(得分:2)

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

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

作为一个冗长的正则表达式:

^              # 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

答案 2 :(得分:1)

最简单的(虽然不是最优雅的)方法是为另一个案例编写类似的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})?))$/

答案 3 :(得分:1)

您可以将,\.替换为[,.]以接受任一位置。它也会使1,000.000.00好。

更难以使正则表达式在JavaScript中表现得像因为你不能使用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

http://jsfiddle.net/AC3Bm/

答案 4 :(得分:1)

查看正则表达式的最佳方法是将其吹嘘 一个非常大的字体,并将其拆分为替代品(|)

var s='1,000,000.00';// tests

var result= /(^\d+([,.]\d+)?$)/.test(s) || // no thousand separator

/((^\d{1,3}(,\d{3})+(\.\d+)?)$)/.test(s) || // comma thousand separator

/((^\d{1,3}(\.\d{3})+(,\d+)?)$)/.test(s); // dot thousand separator

alert(result)

把它的野蛮人放在一起 -

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
*/