web-dev-qa-db-fra.com

Validation des devises regex

J'ai besoin d'aide pour l'expression régulière des devises dans la fonction jQuery.

  • Il permet éventuellement de signer "$" une seule fois au début.
  • Il permet la virgule comme séparateur de groupe numérique, mais pas au début ni à la fin.
  • Il n'autorise que 2 chiffres arrondis après le point décimal.
  • Il n'autorise qu'un seul point décimal et non au début ou à la fin.

Valide:

$1,530,602.24
1,530,602.24

non valide:

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

J'ai essayé /^\$?[0-9][0-9,]*[0-9]\.?[0-9]{0,2}$/i; cela fonctionne bien sauf qu'il correspond à 1,6,999.

29
user2205924

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

La panne RegEx

  • Lorsque les pièces optionnelles sont trop libérales, nous devons anticiper et garantir le nombre: (?=.*\d)
  • Peut ou non commencer par un signe dollar (je suppose que les négatifs ne sont pas valides): ^\$?
    • Suivez cela avec -? pour autoriser les nombres négatifs
  • Commence par 1 à 3 chiffres: [1-9]\d{0,2}
    • Pourrait presque être (\d{1,3}), mais cela permettrait "0,123"
    • Une exception peut commencer par 0 dans le cas de "0,50 $" ou "0,50": |0
    • Ces expressions régulières supposent que plusieurs 0 en tête ne sont pas valides
  • N'importe quel nombre de trois chiffres séparés par une virgule: (,\d{3})*
    • Retirer ? avant \. si vous souhaitez interdire les numéros commençant par "$".
  • Nécessite ou autorise la décimale (un ou deux chiffres): \.\d{1,2} ou (\.\d{1,2})? respectivement
  • Terminer par $ (non échappé) pour vous assurer qu'il n'y a rien après un numéro valide (comme 1 000,00 milliards de dollars)

Pour utiliser l'expression régulière, utilisez la méthode match de la chaîne et placez l'expression régulière entre deux barres obliques.

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

Exemple d'utilisation de base

Démo avec cas de test

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/>');
}
111
Gary