web-dev-qa-db-fra.com

Convertir n'importe quelle chaîne monétaire en double

J'ai besoin de stocker plusieurs devises sur le serveur SQL. Je comprends que SQL ne prend pas en charge tous les types de devises (sauf si je le stocke sous forme de chaîne, mais je ne veux pas le faire).

Mon idée était de convertir toutes les valeurs de leur format monétaire en un double standard et de les stocker à la place. Ensuite, il suffit de reformater en fonction des informations sur la culture lors de l'affichage. Cependant, j'ai essayé de faire quelque chose comme par exemple.

var cultureInfo = new System.Globalization.CultureInfo("en-US");
double plain = return Double.Parse("$20,000.00", cultureInfo);

Cela ne semble jamais fonctionner, mais jette toujours une FormatException. Même en supprimant le symbole monétaire et en essayant simplement de le faire en se basant uniquement sur le nombre, on fait la même chose. Ceci est juste un exemple que je veux soutenir à peu près n'importe quel type de devise. 

Existe-t-il un moyen standard d’extraire de la monnaie et d’obtenir la valeur en double?

36
James

Je pense que cela devrait fonctionner:

double.Parse(currencyValue, NumberStyles.Currency);

Ici vous pouvez en savoir plus sur le NumberStyles .

Edit: au cas où quelqu'un verrait cette réponse sans regarder les autres réponses/commentaires, cette réponse répondait à la question telle qu'elle était écrite, mais stocker la devise sous la forme double n'est pas une bonne idée, et il serait préférable d'utiliser décimal à la place. .

91
Hans Olsson

Vous devez passer NumberStyles à la fonction Parse.

Decimal.Parse("$20,000.00", NumberStyles.AllowCurrencySymbol | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, new CultureInfo("en-US"));

Quelques autres choses, pour les devises, je vous suggérerais d'utiliser Decimal. Et cela pourrait être une solution, mais il serait peut-être préférable de stocker les données de devise sous la forme Money dans la base de données et d'ajouter un code de devise pour identifier la devise de la valeur.

Oui, et les réponses suggèrent NumberStyles.Currency qui serait mieux. C'est une valeur pré-Or'd, si vous pensez toujours que vous voulez utiliser les chaînes.

19
Chris Taylor

Vous pouvez également utiliser le tryparse ()

string input = "$2,000.00";
double parsed = 0d;
double.TryParse(input, NumberStyles.AllowCurrencySymbol | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CurrentCulture, out parsed))
0
hogarth45