Regex currency validation

前端 未结 2 542
予麋鹿
予麋鹿 2020-11-28 07:30

I need Help for currency regex in jQuery function.

  • It optionally allows \"$\" sign only one time in beginning.
  • It allows comma as digital-group-separ
2条回答
  •  一整个雨季
    2020-11-28 08:15

    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]) + '
    '); }

提交回复
热议问题