什么是“最好的”美国货币RegEx?

快速search货币正则expression式带来了很多结果 。
MSDN使用^ – ?\ d +(\。\ d {2})?$

我select其中之一的问题是,如果不testing所有的边界情况,正则expression式很难validation。 我可以花很多时间在这个上,因为我相信其他数百名开发人员已经完成了。

所以…有没有人有一个经过彻底testing的美国货币的正则expression式?

我唯一的要求是匹配的string是美国货币和parsing到System.Decimal :

 [WS] [符号] [数字,]数字[.fractional位数] [WS] 

方括号([和])中的元素是可选的。 
下表介绍了每个元素。 

元素描述
 ws可选空白。
标志可选标志。
数字数字范围从0到9。
 ,文化特定的千位分隔符。
 。 文化特定的小数点符号。
小数位数字的范围从0到9。 

这里是来自Regex Buddy的制作者的一些东西。 这些来自图书馆,所以我相信他们已经过彻底的testing。

数量:货币金额(美分强制)可选数千分隔符; 强制性的两位数分数

Match; JGsoft: ^[+-]?[0-9]{1,3}(?:,?[0-9]{3})*\.[0-9]{2}$ 

数量:货币金额(分可选)可选的千位分隔符; 可选的两位数小数

 Match; JGsoft: ^[+-]?[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]{2})?$ 

数量:货币金额美国和欧盟(美分可选)可使用美式123,456.78表示法和欧式123.456.78表示法。 可选的数千个分隔符; 可选的两位数小数

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

我在www.RegExLib.com上find了这个正则expression式,由Kirk Fuller,Gregg Durishan

过去几年我一直在使用它。

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

根本没有经过彻底的testing(我只是写了!),但似乎performance正确:

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

testing集:

 0 1 33 555 4,656 4656 99,785 125,944 7,994,169 7994169 0.00 1.0 33.78795 555.12 4,656.489 99,785.01 125,944.100 -7,994,169 -7994169.23 // Borderline... Wrong: 000 01 3,3 5. 555, ,656 99,78,5 1,25,944 --7,994,169 0.0,0 .10 33.787,95 4.656.489 99.785,01 1-125,944.1 -7,994E169 

注意:你的System.Decimal是依赖于locale的,很难在正则expression式中做,除了可能在构build时。 我认为数字是由三个分组,即使在某些文化(地区)有不同的规则。
在它周围添加空白是微不足道的。

Keng的答案是完美的,我只是补充说,为1或2小数(第三版)工作:

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

NET FIDDLE: https ://dotnetfiddle.net/1mUpX2

这个问题已经过了几年了,所以我想给出一个更新的答案。

我已经使用了jQuery InputMask ,并且对于input/格式掩码(例如电话号码等)非常有效,但对于我的经验来说,它并不适用于货币。

对于货币,我强烈build议使用autoNumeric jQuery插件。 它维护得很好,他们已经基本上“想到了一切”,我可以想要货币。

实际上,我使用这两种插件的组合来格式化电话号码,数字格式(ISBN等)以及货币(主要是美国货币)。

请记住, jquery.inputmask主要是控制一个值的格式,而autoNumeric是关于具体控制货币的格式。

我使用下面的正则expression式进行货币validation:

 ^-?0*(?:\d+(?!,)(?:\.\d{1,2})?|(?:\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?))$ 

您也可以允许可选的前导美元符号:

 ^\$?-?0*(?:\d+(?!,)(?:\.\d{1,2})?|(?:\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?))$ 

通过添加,您可以轻松添加括号而不是符号的testing

 \( and \) 

我也在看这个,并得出结论,最好是build立在当前文化的基础上的正则expression式。 我们可以使用

 CurrencyPositivePattern CurrencyGroupSeparator CurrencyDecimalSeparator 

NumberFormatInfo属性来获得所需的格式。

编辑:这样的事情

 NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat; // Assign needed property values to variables. string currencySymbol = nfi.CurrencySymbol; bool symbolPrecedesIfPositive = nfi.CurrencyPositivePattern % 2 == 0; string groupSeparator = nfi.CurrencyGroupSeparator; string decimalSeparator = nfi.CurrencyDecimalSeparator; // Form regular expression pattern. string pattern = Regex.Escape( symbolPrecedesIfPositive ? currencySymbol : "") + @"\s*[-+]?" + "([0-9]{0,3}(" + groupSeparator + "[0-9]{3})*(" + Regex.Escape(decimalSeparator) + "[0-9]+)?)" + (! symbolPrecedesIfPositive ? currencySymbol : ""); 

参考 – http://msdn.microsoft.com/en-us/library/hs600312.aspx

我已经取得了成功(从上面的一些正则expression式中抽取一些东西)。 只能处理数以千计,但不应太难以延伸

 case class CurrencyValue(dollars:Int,cents:Int) def cents = """[\.\,]""".r ~> """\d{0,2}""".r ^^ { _.toInt } def dollarAmount: Parser[Int] = """[1-9]{1}[0-9]{0,2}""".r ~ opt( """[\.\,]""".r ~> """\d{3}""".r) ^^ { case x ~ Some(y) => x.toInt * 1000 + y.toInt case x ~ None => x.toInt } def usCurrencyParser = """(\$\s*)?""".r ~> dollarAmount ~ opt(cents) <~ opt( """(?i)dollars?""".r) ^^ { case d ~ Some(change) => CurrencyValue(d, change) case d ~ None => CurrencyValue(d, 0) } 

如果你想考虑到人为错误,你可以使正则expression式匹配货币更宽容。 我使用了Keng的第二个很好的正则expression式,并且使得它更加强大。

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

这将匹配任何这些适当的或损坏的货币数字,但没有拿起空间后的额外的垃圾:

 $46,48382 $4,648,382 $ 4,648,382 $4,648,382.20 $4,648,382.2 $4,6483,82.20 $46,48382 70.25PD $ 46,48382 70.25PD 

这是我使用的:

没有领导+或 –

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

使用可选的领先+或 –

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

小提琴: https : //jsfiddle.net/compsult/9of63cwk/12/