2010-04-21 15 views
1

我已創建Money類以便以不同貨幣存儲貨幣值。類使用3個字母的ISO符號來存儲貨幣類型:如何從C#中的ISOCurrencySymbol格式化貨幣值#

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

有沒有在C#的方式使用這些信息,比如說100.00美元,其格式爲「$ 100.00」?只有我知道的方式需要這樣的CultureInfo:

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

但是,這不適用於我的錢類。還有其他解決方案嗎?我願意改變我的Money課程。

我在本網站搜索了類似的問題(例如this),但找不到回答上述問題的問題。

+0

你能詳細說明你的意思是「這不適用於我的Money課程」嗎? – Amry 2010-04-21 02:21:10

+0

僅僅因爲Money類不存儲CultureInfo,它僅存儲該貨幣的ISO符號。 – Naresh 2010-04-21 12:34:09

回答

2

這是一個非平凡的本地化問題,你在那裏。看看這些例子from MSDN

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

你會如何顯示USD 123.456的人在法國? $123.46123,46 $

我可能堅持使用3字母的ISO符號來顯示它,雖然這個符號的位置在不同的國家也有所不同。從usage guidelines for the EUR symbol

在英文文本中,ISO代碼「歐元」後跟一個固定的空間和金額:

a sum of EUR 30

注:該規則同樣適用於愛爾蘭,拉脫維亞和馬耳他。在所有其他歐盟官方語言中,訂單都是相反的;量之後是固定空間和ISO代碼 'EUR'(或圖形對歐元符號):

une somme de 30 EUR
+0

嗯...,我明白你在說什麼。我希望至少有一種方法可以爲給定的當地貨幣格式化所有貨幣。例如,如果以en-US語言環境運行,USD將顯示爲$ 100.00,日元顯示爲¥123。 – Naresh 2010-04-21 12:38:36

0

檢查此擴展方法:

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); 
} 

用法:

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 

此代碼自: http://lukencode.com/2012/05/28/quick-and-dirty-csharp-currency-helper/