Convalida della valuta del Regex

Ho bisogno di aiuto per regex di valuta nella funzione jQuery.

  • Opzionalmente consente il segno “$” solo una volta all’inizio.
  • Permette la virgola come separatore di gruppi digitali, ma non all’inizio né alla fine.
  • Permette solo 2 cifre arrotondate dopo il punto decimale.
  • Permette solo un punto decimale e non all’inizio né alla fine.

Valido:

$1,530,602.24 1,530,602.24 

Non valido:

 $1,666.24$ ,1,666,88, 1.6.66,6 .1555. 

Ho provato / /^\$?[0-9][0-9,]*[0-9]\.?[0-9]{0,2}$/i ?[ /^\$?[0-9][0-9,]*[0-9]\.?[0-9]{0,2}$/i ,]*[ /^\$?[0-9][0-9,]*[0-9]\.?[0-9]{0,2}$/i .?[ /^\$?[0-9][0-9,]*[0-9]\.?[0-9]{0,2}$/i ; funziona bene tranne che corrisponde a 1,6,999 .

Il 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" 

Il guasto RegEx

  • Quando le parti facoltative sono troppo liberali, dobbiamo guardare avanti e garantire che ci sia un numero: (?=.*\d)
  • Può o non può iniziare con un segno di dollaro (presumo che i negativi non siano validi): ^\$?
    • Seguilo con -? per consentire numeri negativi
  • Inizia con 1-3 numeri: [1-9]\d{0,2}
    • Potrebbe essere quasi (\d{1,3}) , ma ciò consentirebbe “0,123”
    • Un’eccezione può iniziare con 0 nel caso di “$ 0,50” o “0,50”: |0
    • Queste regex presuppongono che più 0 iniziali non sono validi
  • Qualsiasi numero di numeri a tre cifre separati da una virgola: (,\d{3})*
    • Rimuovere ? prima \. se si desidera disabilitare i numeri che iniziano con “$”.
  • Richiede o consente decimale (una o due cifre): \.\d{1,2} o (\.\d{1,2})? rispettivamente
  • Termina con $ (senza escape) per assicurarti che non ci sia nulla dopo un numero valido (come $ 1,000.00b)

Per usare la regex, usa il metodo di match della stringa e racchiudi la regex tra due barre in avanti.

 // 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})?$/); 

Esempio di utilizzo di base

Demo con Test Case

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

Ecco l’espressione regolare che dovrebbe realizzare questo per te.

L’inizio deve essere numerico o $ segno. È ansible inserire un numero qualsiasi di cifre con virgole, ma deve iniziare e terminare con una cifra. Può essere opzionalmente un punto decimale con un massimo di due cifre dopo di esso alla fine della riga.

 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!"); 

O usare questa funzione

 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); } 

Guardalo mentre lavora: http://jsfiddle.net/znuJf/