JavaScript中用于货币值的正则表达式

12

我已经有一段时间没有接触正则表达式了。现在尝试想出一个可以让用户输入带/不带美元符号或带/不带逗号的货币价值的正则表达式。例如,以下所有值都应该是有效的:

5
5.1
5.10
$5
500,000
500,000.1
500,000.10
$100,000,000.50
etc....

请问有人可以帮我吗?


尝试访问这个网站:http://regexlib.com/Search.aspx?k=money - Larry Battle
5个回答

23
这应该可以起作用:
isValid = str.search(/^\$?[\d,]+(\.\d*)?$/) >= 0;

对逗号的放置有更严格的要求(例如会拒绝 3,2.10):

isValid = str.search(/^\$?\d+(,\d{3})*(\.\d*)?$/) >= 0;

要从中获得一个数字:

if(isValid) {
  var num = Number(str.replace(/[\$,]/g, ''));
  ...
}

2
不要使用 string.search(regex)>-1,而是直接使用 regex.test(string) - Bergi
你的第一个正则表达式有错误。正则表达式将"10."解释为true。使用+而不是*表示“至少1次”。尝试将isValid = str.search(/^$?[\d,]+(.\d+)?$/)>= 0; - heymatthew
@MatthewB.Gray 这不是一个错误。我认为“10.”是有效的。问题没有明确说明任何一种方式。 - Kip
快速提醒,当我测试时注意到,我会将 (\.\d*)? 更改为 (\.\d{2})?,因为分钱几乎总是到百分之一,不再多了。此外,第一个 \d+ 可以是 \d{1,3},这样它就不会只匹配逗号前的所有数字。 - Riot Goes Woof
看起来上面的解决方案无法通过 .99 的值,但可以通过 0.99。有没有办法考虑到 .99? - gojohnnygo
显示剩余4条评论

2

这次我没有使用Qunit框架进行测试驱动开发(TDD)。

TDD概述 http://net.tutsplus.com/tutorials/javascript-ajax/test-driven-javascript-development-in-practice/

第一步:编写测试。

第二步:观察测试失败。

第三步:使测试通过。

第四步:重构。

var moneyTest_RE = /^\$?\d+((,\d{3})+)?(\.\d+)?$/;
test("test money format for valid values", function () {
    var moneyArr = ["5","5.1","5.10","$5","500,000","500,000.1","500,000.10","$100,000,000.50", "500,000,100" ];
    var i = moneyArr.length;

    while( i-- ){
        equal( moneyTest_RE.test( moneyArr[ i ] ), true, moneyArr[ i ] + " didn't match completely." );
    }
});
test("test money format for invalid values", function () {
    var moneyArr = ["5..","$$5.1",".5.10","$5.2.","50,0,000",",500,000.1","500,000,10,","$1,00,000,000.50", "500,000,10"];
    var i = moneyArr.length;

    while( i-- ){
        equal( moneyTest_RE.test( moneyArr[ i ] ), false, moneyArr[ i ] + " didn't match completely." );
    }
});

这是解决您问题的一种可能方案。
var moneyTest_RE = /^\$?\d+((,\d{3})+)?(\.\d+)?$/;  

这里有一个演示: http://jsfiddle.net/vpyV6/

我忘记重构了。


1

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

这个花了一些时间,但最终我得到了一个完全功能的东西。它允许像100.00、.35、$1.35等情况。同时排除掉逗号放错位置、逗号之间或之前数字过多或小数点后数字过多的输入。
你可以在这里进行测试。

0
var currencyRegex = /^[$£€]\d+(?:\.\d\d)*$/g;

例子:$10 或 £10 或 €10,但如果你使用简单的10,那就是错误的。


0

你还想让我发布什么? - user1034533
谢谢,你在我2012年的评论后不久添加的内容已经足够了 - 我正在删除这个不再适用的评论。我没有投反对票,那是去年12月的事情。也许你的答案之所以被踩是因为它没有使用JS正则表达式字面量语法,或者因为它允许使用:字符,或者因为它允许使用.紧接着, - Bergi
啊,我没有投入足够的精力去修复那些点和逗号的问题,但是冒号的问题已经被修复了! - user1034533

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接