35
votes

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.

2
What do you have so far? What are the problems with it?Wiseguy
I am new to jquery i do not know how to write regex function.If you can help me that would be greatuser2205924
your question has nothing to do with jQuery. In JavaScript, you have method String.matches, e.g. var str="123.45"; if(str.matches(/YOUR_REGEX/)) alert("match"); else alert("not a match"); For concrete regular expressions see answers below.Alex Shesterov
@Gary: thanks, was a typo. Unfortunately, I cannot edit the comment anymore. @user2205924: the method is called match, (not matches). Sorry.Alex Shesterov
Possible duplicate of What is "The Best" U.S. Currency RegEx?Liam

2 Answers

132
votes

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/>');
}
-1
votes

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/