67 votes

Quelle est La "Meilleure" Monnaie des états-UNIS RegEx?

Une recherche rapide de la monnaie regex apporte beaucoup de résultats.
MSDN utilise ^-?\d+(\.\d{2})?$

Le problème que j'ai dans le choix de l'une de ces raisons est que la regex est difficile à vérifier sans tester tous les cas de bord. J'ai pu passer beaucoup de temps sur ce que je suis sûr que des centaines d'autres développeurs l'ont déjà fait.

Alors ... quelqu'un a une regex pour Monnaie des états-UNIS qui a été soigneusement testé?

Ma seule exigence est que la chaîne trouvée est U. S de la Monnaie et de l' analyse de Système.Virgule:

[ws][signature][chiffres,]chiffres[.les fractions de chiffres][ws] 

Les éléments entre crochets ([ et ]) sont facultatifs. 
Le tableau suivant décrit chaque élément. 

DESCRIPTION DE L'ÉLÉMENT DE
ws Facultatif de l'espace blanc.
signe Un signe optionnel.
les chiffres d'Une séquence de chiffres allant de 0 à 9.
Une culture spécifique séparateur de milliers de symbole.
. Une culture spécifique symbole de virgule décimale.
les fractions de chiffres d'Une séquence de chiffres allant de 0 à 9. 

108voto

Keng Points 10618

voici quelques trucs à partir des fabricants de Regex Copain. Ces résultats proviennent de la bibliothèque, donc je suis confiant qu'ils ont été soigneusement testés.

Nombre: montant en Devise (en cents obligatoire) En option les séparateurs de milliers, obligatoire à deux chiffres fraction

Match; JGsoft:
^[+-]?[0-9]{1,3}(?:,?[0-9]{3})*\.[0-9]{2}$

Nombre: montant en Devise (en cents facultatif) En option les séparateurs de milliers; en option à deux chiffres fraction

Match; JGsoft:
^[+-]?[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]{2})?$

Nombre: montant en Devise US & UE (en cents facultatif) Pouvez utiliser ce style, 123,456.78 notation et de style Européen 123.456,78 notation. En option les séparateurs de milliers; en option à deux chiffres fraction

Match; JGsoft:
^[+-]?[0-9]{1,3}(?:[0-9]*(?:[.,][0-9]{2})?|(?:,[0-9]{3})*(?:\.[0-9]{2})?|(?:\.[0-9]{3})*(?:,[0-9]{2})?)$

10voto

PhiLho Points 23458

Pas testés à tous (j'ai juste écrit ça!), mais semble se comporter correctement:

^-?(?:0|[1-9]\d{0,2}(?:,?\d{3})*)(?:\.\d+)?$

Ensemble de Test:

0
1
33
555
4,656
4656
99,785
125,944
7,994,169
7994169
0.00
1.0
33.78795
555.12
4,656.489
99,785.01
125,944.100
-7,994,169
-7994169.23 // Borderline...

Wrong:
000
01
3,3
5.
555,
,656
99,78,5
1,25,944
--7,994,169
0.0,0
.10
33.787,95
4.656.489
99.785,01
1-125,944.1
-7,994E169

Remarque: Votre Système.Virgule est locale dépendante, difficile de faire dans la regex, sauf peut-être lors de sa construction. Je suppose chiffres groupées par trois, même si dans certaines cultures (paramètres régionaux) il y a des règles différentes.
Il est trivial pour ajouter de l'espace autour d'elle.

1voto

NoviceProgrammer Points 1498

Je la regardais aussi et en sont venus à la conclusion qu'il est préférable de construire l'expression rationnelle basée sur la culture actuelle. Nous pouvons utiliser la

CurrencyPositivePattern 
CurrencyGroupSeparator
CurrencyDecimalSeparator

propriétés de l' NumberFormatInfo pour obtenir le format requis.

Edit: quelque chose comme ceci

NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat;
      // Assign needed property values to variables.
      string currencySymbol = nfi.CurrencySymbol;
      bool symbolPrecedesIfPositive = nfi.CurrencyPositivePattern % 2 == 0;
      string groupSeparator = nfi.CurrencyGroupSeparator;
      string decimalSeparator = nfi.CurrencyDecimalSeparator;

      // Form regular expression pattern.
      string pattern = Regex.Escape( symbolPrecedesIfPositive ? currencySymbol : "") + 
                       @"\s*[-+]?" + "([0-9]{0,3}(" + groupSeparator + "[0-9]{3})*(" + 
                       Regex.Escape(decimalSeparator) + "[0-9]+)?)" + 
                       (! symbolPrecedesIfPositive ? currencySymbol : ""); 

consultez - http://msdn.microsoft.com/en-us/library/hs600312.aspx

1voto

eitanpo Points 315

Je suis en utilisant l'expression régulière suivante pour la monnaie de validation:

^-?0*(?:\d+(?!,)(?:\.\d{1,2})?|(?:\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?))$

Vous pouvez également autoriser l'option de pointe signe dollar:

^\$?-?0*(?:\d+(?!,)(?:\.\d{1,2})?|(?:\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?))$

Vous pouvez facilement ajouter des tests pour des parenthèses au lieu du signe par l'ajout d'

\( and \)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X