正则表达式
// 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})*
- 如果您想禁止以“$”开头的数字,请删除
?
before 。\.
- 要求或允许小数(一位或两位):
\.\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/>');
}