正则表达式货币验证

use*_*924 29 javascript regex currency

我需要在jQuery函数中使用货币正则表达式的帮助.

  • 它可选择在开始时只允许"$"符号一次.
  • 它允许逗号作为数字组分隔符,但不能在开头或结尾.
  • 它只允许在小数点后舍入2位数.
  • 它只允许一个小数点而不是开头或结尾.

有效:

$1,530,602.24
1,530,602.24
Run Code Online (Sandbox Code Playgroud)

无效:

$1,666.24$
,1,666,88,
1.6.66,6
.1555.
Run Code Online (Sandbox Code Playgroud)

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

Gar*_*ary 111

RegEx

// 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"
Run Code Online (Sandbox Code Playgroud)

RegEx细分

  • 当可选部件过于自由时,我们需要向前看,并保证有一个数字: (?=.*\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})?$/);
Run Code Online (Sandbox Code Playgroud)

基本用法示例

测试用例演示

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/>');
}
Run Code Online (Sandbox Code Playgroud)

  • 这是我见过的最好的正则表达式.羞耻OP没有标记为答案或评论为什么它不被接受.无论如何,你有我的感激之情:) (6认同)
  • 你应该创建一个jsFiddle来证明它,因为这实际上是正确的 (2认同)

Bre*_*ent -1

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

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

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!");
Run Code Online (Sandbox Code Playgroud)

或者使用这个功能

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);
}
Run Code Online (Sandbox Code Playgroud)

查看它的工作原理: http: //jsfiddle.net/znuJf/

  • 小提琴不满足此测试 print_results("1,6,6677");如果您能提供帮助,那就太好了。太感谢了。 (2认同)