Regex currency validation
currency, javascript, regex
Solution
The 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"
The RegEx Breakdown
- When the optional parts are too liberal, we need to look ahead and guarantee there's a number: `(?=.*\d)`
- May or may not start with a dollar sign (I assume negatives are invalid): `^\$?`
- Follow that with `-?` to allow negative numbers
- Begins with 1-3 numbers: `[1-9]\d{0,2}`
- Could almost be `(\d{1,3})`, but that would allow "0,123"
- One exception, can start with 0 in the case of "$0.50" or "0.50": `|0`
- These regexes assume multiple leading 0's are invalid
- Any number of three digit numbers separated by comma: `(,\d{3})*`
- Remove `?` before `\.` if you want to disallow numbers starting with "$."
- Requires or allows decimal (one or two digits): `\.\d{1,2}` or `(\.\d{1,2})?` respectively
- End with `$` (unescaped) to make sure there's nothing after a valid number (like $1,000.00b)
To use the regex, use the string's `match` method and encase the regex between two forward slashes.
// 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})?$/);
Basic Usage Example
Demo with Test Cases
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/>');
}
Problem
I need Help for currency regex in jQuery function. - It optionally allows "$" sign only one time in beginning. - It allows comma as digital-group-separator, but not in the beginning or the end. - It allows only 2 digits rounded after decimal point. - It allows only one decimal point and not in the beginning or the end. Valid: ``` $1,530,602.24 1,530,602.24 ``` Invalid: ``` $1,666.24$ ,1,666,88, 1.6.66,6 .1555. ``` I tried `/^\$?[0-9][0-9,]*[0-9]\.?[0-9]{0,2}$/i`; it works fine except it matches `1,6,999`.