11

有一段时间没玩了regex。试图想出一些允许用户输入货币价值的东西,无论是带/不带美元符号还是带/不带逗号。例如,以下所有值都应该是有效的:

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

有人可以帮我吗?

4

5 回答 5

21

这应该有效:

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, ''));
  ...
}
于 2012-08-03T16:24:46.943 回答
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/

不过我忘了重构。

于 2012-08-03T16:42:08.297 回答
1

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

这个花了一段时间,但我终于得到了一些功能齐全的东西。它允许 100.00、.35、$1.35 等情况。同时排除逗号错位、逗号之间或之前的数字过多或小数点后数字过多的条目。

你可以在这里

于 2014-06-09T15:18:15.653 回答
0

也许这个? http://refiddle.com/2tg

(\$?(:?\d+,?.?)+)

另外,http://refiddle.com/2ti;与 123,45.4.3 等数字不匹配的较长版本

^(\$?(:?\d+,?)+(?:.?\d+)?)$
于 2012-08-03T16:26:19.870 回答
0
var currencyRegex = /^[$£€]\d+(?:\.\d\d)*$/g;

示例:$10 or £10 0r €10但是如果您使用简单10,这将是错误的

于 2018-06-30T05:04:35.500 回答