Regex currency validation
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
- Follow that with
- 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
- Could almost be
- Any number of three digit numbers separated by comma:
(,\d{3})*
- Remove
?
before\.
if you want to disallow numbers starting with "$."
- Remove
- 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 foundyourNumber.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})?$/);
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/>');}
Here is the regular expression that should achieve this for you.
The start must be numeric or $ sign.There can be any number of digits with commas, but it must start and end with a digit.There can optionally be a decimal point with up to two digits after it at the end of the line.
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!");
Or use this function
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);}
See it working: http://jsfiddle.net/znuJf/