正则表达式货币验证

IT技术 javascript regex currency
2021-03-11 08:29:13

我需要有关 jQuery 函数中货币正则表达式的帮助。

  • 它可以选择只允许“$”符号在开始时出现一次。
  • 它允许逗号作为数字组分隔符,但不能在开头或结尾。
  • 它只允许小数点后四舍五入的 2 位数字。
  • 它只允许一个小数点,而不是在开头或结尾。

有效的:

$1,530,602.24
1,530,602.24

无效的:

$1,666.24$
,1,666,88,
1.6.66,6
.1555.

我试过了/^\$?[0-9][0-9,]*[0-9]\.?[0-9]{0,2}$/i除了匹配之外,它工作正常1,6,999

2个回答

正则表达式

// Requires a decimal and commas
^\$?(([1-9]\d{0,2}(,\d{3})*)|0)?\.\d{1,2}$

// Allows a decimal, requires commas
(?=.*\d)^\$?(([1-9]\d{0,2}(,\d{3})*)|0)?(\.\d{1,2})?$

// Decimal and commas optional
(?=.*?\d)^\$?(([1-9]\d{0,2}(,\d{3})*)|\d+)?(\.\d{1,2})?$

// Decimals required, commas optional
^\$?(([1-9]\d{0,2}(,\d{3})*)|0)?\.\d{1,2}$

// *Requires/allows X here also implies "used correctly"

正则表达式细分

  • 当可选部分过于宽松时,我们需要向前看并保证有一个数字: (?=.*\d)
  • 可能会也可能不会以美元符号开头(我认为负数是无效的): ^\$?
    • 按照那个-?允许负数
  • 以 1-3 个数字开头: [1-9]\d{0,2}
    • 几乎可以(\d{1,3}),但这将允许“0,123”
    • 一个例外,在 "$0.50" 或 "0.50" 的情况下可以从 0 开始: |0
    • 这些正则表达式假定多个前导 0 无效
  • 以逗号分隔的任意数量的三位数: (,\d{3})*
    • 删除?之前\.,如果你想开始不允许号“$”。
  • 需要或允许十进制(一位或两位数字):\.\d{1,2}(\.\d{1,2})?分别
  • $(未转义)结尾以确保有效数字后没有任何内容(例如 $1,000.00b)

要使用正则表达式,请使用字符串的match方法并将正则表达式包含在两个正斜杠之间。

// The return will either be your match or null if not found
yourNumber.match(/(?=.)^\$?(([1-9][0-9]{0,2}(,[0-9]{3})*)|0)?(\.[0-9]{1,2})?$/);

// For just a true/false response
!!yourNumber.match(/(?=.)^\$?(([1-9][0-9]{0,2}(,[0-9]{3})*)|0)?(\.[0-9]{1,2})?$/);

基本使用示例

带有测试用例的演示

var tests = [
    "$1,530,602.24", "1,530,602.24", "$1,666.24$", ",1,666,88,", "1.6.66,6", ".1555."
];

var regex = /(?=.*\d)^\$?(([1-9]\d{0,2}(,\d{3})*)|0)?(\.\d{1,2})?$/;

for (i = 0; i < tests.length; i++) { 
  console.log(tests[i] + ' // ' + regex.test(tests[i]));
  document.write(tests[i] + ' // ' + regex.test(tests[i]) + '<br/>');
}

这是迄今为止我见过的最好的正则表达式。耻辱 OP 没有标记为答案或评论为什么它不被接受。无论如何,你有我的感激之情:)
2021-04-16 08:29:13
我尝试删除 '$' 程序 '\.' 为了禁止“十进制和逗号可选”使用美元符号,但它似乎仍然通过。有什么想法吗?(?=.)^\$?(([1-9][0-9]{0,2}(,[0-9]{3})*)|[0-9]+)(\. [0-9]{1,2})?$
2021-04-28 08:29:13
您应该创建一个 jsFiddle 来证明它,因为这实际上似乎是正确的
2021-05-05 08:29:13
我找不到最喜欢的标志作为答案!很好的反应。
2021-05-12 08:29:13
@TR3B 你双重逃脱了美元符号。 ^\\$表示字面反斜杠,必须在匹配的开头 (^) 和结尾 ($) ......所以,只是那个字符。删除其中一个反斜杠。
2021-05-12 08:29:13

这是应该为您实现这一目标的正则表达式。

开头必须是数字或 $ 符号。可以有任意数量的带逗号的数字,但必须以数字开头和结尾。行尾可以有一个最多两位小数点。

var your_input = "$1,000,000.00";
var valid_dollar_amt_regex = /^\$?[0-9][0-9,]*[0-9]\.?[0-9]{0,2}$/i;

if(valid_dollar_amt_regex.test(your_input))
    alert("Valid!");

或者使用这个功能

function validate_money(i) {
    var valid_dollar_amt_regex = /^\$?[0-9][0-9,]*[0-9]\.?[0-9]{0,2}$/i;
    return valid_dollar_amt_regex.test(i);
}

看到它工作:http : //jsfiddle.net/znuJf/

它工作正常,但不适用于逗号。例如,120,0,00,
2021-04-17 08:29:13
小提琴满足您的所有测试。,120,0,00, 假jsfiddle.net/znuJf/1
2021-04-18 08:29:13
小提琴不满足这个测试 print_results("1,6,6677"); 如果你能帮忙,那就太好了。太感谢了。
2021-04-22 08:29:13
它也通过了,1,11,1111.00因为它只是匹配(几个数字 + 逗号)并无限期地重复,只要它不以 1 结尾。
2021-05-02 08:29:13
我错过了其他[0-9][0-9,]*意味着一个数字和任意数量的数字或逗号,所以1,,,,1.00也匹配。另外,为什么有一个用于数字的不区分大小写的标志?
2021-05-07 08:29:13