Je souhaite valider le montant avec le scénario ci-dessous. L'expression régulière ci-dessous fonctionne sauf «,» par exemple 1,000.0000

^(?!0*(\.0+)?$)(\d*(?:\.[0-9]{0,4})?)$

1 - should pass
0.1 - should pass
.1 - should pass
0 - should fail
.0001 - should pass
.10 - should pass
0.0  - should fail
0.00000 - should fail (only accept 4 digits after the decimal point)
1.0000 - should pass
1,000.0000 - should pass
1,000,00.000 - should pass
1,000.0000 - should pass
1
boycod3 16 oct. 2020 à 11:09

2 réponses

Meilleure réponse

^(?![0,]*(\.0+)?$)([,\d]*(?:\.[0-9]{0,4})?)$. J'ai simplement remplacé le \d avant le séparateur décimal par [,\d]; et aussi dans l'assertion négative, de sorte que 0,000.00 ne correspond pas. Il permet de placer n'importe quel nombre de virgules partout, et c'est raisonnable, car les traditions locales de regroupement des chiffres diffèrent.

Voulez-vous également que les nombres avec des points suspendus, comme 10., correspondent? Sinon, remplacez {0,4} par {1,4}. https://regex101.com/r/XB8OtL/3.

1
Alexander Mashin 16 oct. 2020 à 08:32

Changer le dernier ? (zéro ou une répétition) par un * (n'importe quel nombre de répétitions) (donc ^(?!0*(.0+)?$)(\d*(?:.[0-9]{0,4})*)$) validera les entrées qui devraient valider (c'est la répétition du ,000 ou .000 qui échoue au test). Au fait, votre regex pourrait être améliorée: parce que vous utilisez . (n'importe quel caractère) au lieu de \. (point) ou ',' coma, votre regex c'est à dire valider les mauvaises entrées comme '1x0000' ou '1 # 0000 '(n'importe quel caractère)

1
Max Xapi 16 oct. 2020 à 08:24