2010-04-21 3 views
1

J'ai créé une classe Money pour économiser de l'argent dans différentes devises. La classe utilise trois lettres symboles ISO pour stocker les types de devises:Comment formater une valeur monétaire à partir d'un ISOCurrencySymbol en C#

public class Money 
{ 
    public decimal Amount { get; set; } 
    public string Currency { get; set; } 
} 

Est-il possible en C# d'utiliser ces informations, disent 100,00 USD, et le format comme « 100,00 $ »? Seul le moyen que je connais nécessite CultureInfo comme ceci:

Amount.ToString("C", CultureInfo.CreateSpecificCulture("en-US")); 

Cependant, cela ne fonctionne pas avec ma classe Money. Y a-t-il une autre solution? Je suis ouvert à changer de classe Money.

J'ai recherché sur ce site pour des questions similaires (par exemple this), mais je n'ai pas trouvé de réponse à la question ci-dessus.

+0

Pouvez-vous préciser ce que vous entendez par "cela ne fonctionne pas avec mon cours"? – Amry

+0

Tout simplement parce que la classe Money ne stocke pas CultureInfo, elle ne stocke que le symbole ISO de la devise. – Naresh

Répondre

2

C'est un problème de localisation non-trivial que vous avez ici. Regardez ces exemples from MSDN:

 
123.456 ("C", en-US) -> $123.46 
123.456 ("C", fr-FR) -> 123,46 € 
123.456 ("C", ja-JP) -> ¥123 

Comment présenteriez-vous à quelqu'un USD 123.456 en France? $123.46 ou 123,46 $?

Je serais probablement en train de l'afficher en utilisant le symbole ISO à 3 lettres, bien que la position de ce symbole semble varier également d'un pays à l'autre. De usage guidelines for the EUR symbol:

Dans les textes anglais, le code ISO « EUR » est suivi d'un espace fixe et le montant:

a sum of EUR 30

NB: La même règle est applicable en irlandais, letton et maltais. Dans toutes les autres langues officielles de l'UE, la commande est inversée; le montant est suivi d'un espace fixe et le code ISO 'EUR' (ou le signe euro dans les graphiques):

une somme de 30 EUR
+0

Hmmm ..., je comprends ce que vous dites. Je souhaite qu'il y avait au moins un moyen de formater toutes les devises pour un local donné. Par exemple, si l'exécution se fait dans les paramètres régionaux en-US, l'USD sera affiché à 100,00 $ et le Yen à 123 ¥. – Naresh

0

Cocher cette méthode d'extension:

public static string FormatCurrency(this decimal amount, string currencyCode) 
{ 
    var culture = (from c in CultureInfo.GetCultures(CultureTypes.SpecificCultures) 
      let r = new RegionInfo(c.LCID) 
      where r != null 
      && r.ISOCurrencySymbol.ToUpper() == currencyCode.ToUpper() 
      select c).FirstOrDefault(); 

    if (culture == null) 
     return amount.ToString("0.00"); 

    return string.Format(culture, "{0:C}", amount); 
} 

Utilisation:

decimal amount = 100; 

amount.FormatCurrency("AUD"); //$100.00 
amount.FormatCurrency("GBP"); //£100.00 
amount.FormatCurrency("EUR"); //100,00 € 
amount.FormatCurrency("VND"); //100,00 ₫ 
amount.FormatCurrency("IRN"); //₹ 100.00 

Ce code est de: http://lukencode.com/2012/05/28/quick-and-dirty-csharp-currency-helper/

Questions connexes