什么是“最好的”美国货币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 : "");
我已经取得了成功(从上面的一些正则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/