Rexact
Cheatsheet

Regex montant monétaire

L'auteur de la question de référence sur Stack Overflow a un problème très concret, qu'il documente lui-même avec sa propre liste de cas de test : sa regex fonctionne sur tout sauf les montants négatifs. Une première réponse (3 votes) corrige ça et ajoute le support de « USD$ »… mais en testant réellement ce correctif, il supprime par erreur le support du symbole « $ » utilisé seul, qui fonctionnait pourtant dans la version d'origine — une vraie régression, jamais signalée dans le fil. Un motif largement republié en ligne a un défaut différent, trouvé en le testant : son premier groupe de chiffres avant la virgule n'est pas limité à 3 caractères, donc « 123456,789 » passe comme un montant à séparateurs de milliers valide. Voici un motif qui évite ces deux pièges, comparé aux 3 tentatives réelles.

/^(?:(?:USD)?\$)?-?(?:\d+|\d{1,3}(?:,\d{3})*)(?:\.\d{1,2})?$/
passe 20/20 cas

Comparatif des patterns existants

Implémentation

const re = new RegExp("^(?:(?:USD)?\\$)?-?(?:\\d+|\\d{1,3}(?:,\\d{3})*)(?:\\.\\d{1,2})?$", "");
re.test(input);

Limites

  • L'ordre du signe négatif est figé : « $-123.45 » (symbole puis signe) est accepté, mais « -$123.45 » (signe puis symbole), pourtant une convention d'affichage tout aussi réelle, est rejeté par ce motif — un choix hérité de la structure de la réponse source, pas une règle universelle.
  • N'accepte que le symbole « $ » (avec ou sans « USD » devant) : aucun autre symbole monétaire (€, £, ¥...) n'est reconnu, chacun nécessitant une adaptation du motif.
  • Ne représente pas les montants négatifs entre parenthèses (« (123.45) »), une convention comptable réelle et répandue, distincte du simple signe moins.
  • Valide uniquement la forme : n'arrondit rien, ne vérifie aucune plage de valeurs, et n'effectue aucune conversion — un montant syntaxiquement valide peut dépasser toute limite métier propre à l'application qui l'utilise.