web-dev-qa-db-fra.com

Problème lors de l'analyse du texte monétaire en type décimal

J'essaie d'analyser une chaîne comme "45,59 $" en une décimale. Pour une raison quelconque, je reçois une exception selon laquelle l'entrée n'était pas au bon format. Je ne me soucie pas de tout ce qui concerne la localisation car cela ne va pas être un programme global. Voici ce que je fais. Voyez-vous des problèmes?

NumberFormatInfo MyNFI = new NumberFormatInfo(); 
MyNFI.NegativeSign = "-"; 
MyNFI.NumberDecimalSeparator = "."; 
MyNFI.NumberGroupSeparator = ",";
MyNFI.CurrencySymbol = "$"; 
decimal d  = decimal.Parse("$45.00", MyNFI);    // throws exception here...
48
PICyourBrain

Que diriez-vous d'utiliser:

decimal d = decimal.Parse("$45.00", NumberStyles.Currency);

La documentation MSDN sur Decimal.Parse indique:

"Le paramètre s est interprété à l'aide du style NumberStyles.Number. Cela signifie que les espaces blancs et les séparateurs de milliers sont autorisés mais pas les symboles monétaires. Pour définir explicitement les éléments (tels que les symboles monétaires, les milliers de séparateurs et les espaces blancs) qui peuvent être présent dans s, utilisez la méthode Decimal.Parse (String, NumberStyles, IFormatProvider)

102
John Koerner

De cette façon, cela fonctionne pour moi:

NumberFormatInfo MyNFI = new NumberFormatInfo();
MyNFI.NegativeSign = "-";
MyNFI.CurrencyDecimalSeparator = ".";
MyNFI.CurrencyGroupSeparator = ",";
MyNFI.CurrencySymbol = "$";

decimal d = decimal.Parse("$45.00", NumberStyles.Currency, MyNFI);

1.) Vous devez définir le séparateur de devises au lieu du séparateur de nombres. 2.) Parce que vous avez défini uniquement les valeurs monétaires, vous devez définir le NumberStyles.Currency lors de l'analyse.

14
MEN

Lorsque j'essayais d'exécuter le code à partir de @JohnKoerner, il échouait à l'exception: System.FormatException, Avec le message: "Input string was not in a correct format.". La réponse de @ MEN a été utile, mais je voulais ajouter quelques informations supplémentaires sur la réponse acceptée et comment résoudre ce problème.

Tout comme @MEN, j'ai dû inclure NumberFormatInfo avant que la méthode .Parse() fonctionne correctement. Cependant, spécifier la décimale avec CurrencyDecimalSeparator n'était pas nécessaire pour moi. Vous devrez inclure toutes les propriétés dont vous avez besoin pour vos numéros. Voici une liste dans les documents de définition de classe:

Documents MSDN - Classe NumberFormatInfo

Je n'obtiendrai jamais de nombres négatifs dans mon implémentation, j'ai donc choisi de ne pas l'inclure. Voici ce que j'ai:

string currencyAmount = "$45.00";

NumberFormatInfo FormatInfo = new NumberFormatInfo();
FormatInfo.CurrencyGroupSeparator = ",";
FormatInfo.CurrencySymbol = "$";

// Result: 45.00
decimal parsedCurrency = decimal.Parse(currencyAmount, NumberStyles.Currency, FormatInfo);
0
kbpontius