2012-11-13 79 views
6

我有一個包含金額和貨幣代碼(美元,日元,加元,歐元等)的費用表,並且正在尋找正確格式化貨幣的最簡單方法。使用我的本地文化代碼(美國),並採取我的decimal.ToString(「C」)得到0.00美元的輸出,但我想正確的貨幣符號和基於代碼的小數位數。根據貨幣代碼將貨幣格式設置爲貨幣

是否存在這樣的庫?我當然可以爲每一個寫一個switch語句和自定義規則,但是認爲這一定是以前完成的。

更新:

我修改喬恩·B的示例代碼如下

static IDictionary<string, string> GetCurrencyFormatStrings() 
{ 
    var result = new Dictionary<string, string>(); 

    foreach (var ci in CultureInfo.GetCultures(CultureTypes.AllCultures)) 
    { 
     try 
     { 
      var ri = new RegionInfo(ci.Name); 
      result[ri.ISOCurrencySymbol] = 
        string.Format("{0}#,#0.{1};({0}#,#0.{1})", 
           ri.CurrencySymbol, 
           new string('0', 
           i.NumberFormat.CurrencyDecimalDigits)); 
     } 
     catch { } 
    } 

    return result; 
} 

這讓我簡單地去Amount.ToString(貨幣[ 「JPY」]),以及格式輸出我的本地上下文中的逗號分隔符,但自動放置正確的貨幣符號和小數位。

讓我知道是否有人有這樣做的更清潔的方法,或者我會標記喬恩的答案很快就是正確的。

+0

@AakashM - 事實上它確實存在。它被稱爲'CultureInfo'。 –

+0

撤回我以前的評論,我注意到['RegionInfo'知道區域貨幣的貨幣代碼](http://msdn.microsoft.com/zh-cn/library/system.globalization.regioninfo.isocurrencysymbol.aspx),所以框架確實有這些知識。我懷疑你將不得不迭代,因爲我沒有看到任何基於貨幣代碼的查找。 – AakashM

+0

@Ramhound CultureInfo告訴你如何在給定的文化中格式化貨幣數量。它沒有告訴你日元的符號是¥。 – AakashM

回答

2

你可以建立一個字典從ISO貨幣符號(美元),以貨幣符號去($):

static void Main(string[] args) 
{ 
    var symbols = GetCurrencySymbols(); 

    Console.WriteLine("{0}{1:0.00}", symbols["USD"], 1.5M); 
    Console.WriteLine("{0}{1:0.00}", symbols["JPY"], 1.5M); 

    Console.ReadLine(); 
} 

static IDictionary<string, string> GetCurrencySymbols() 
{ 
    var result = new Dictionary<string, string>(); 

    foreach (var ci in CultureInfo.GetCultures(CultureTypes.AllCultures)) 
    { 
     try 
     { 
      var ri = new RegionInfo(ci.Name); 
      result[ri.ISOCurrencySymbol] = ri.CurrencySymbol;      
     } 
     catch { } 
    } 

    return result; 
} 

這是基本的的想法,你需要調整,以滿足您的需求。

請注意,您當然可以使用CultureInfo類轉換爲特定文化的字符串,但正如在Alexei的評論中指出的那樣,這會導致每個字符串有點不同(如1.00與1,00)。無論你使用哪個取決於你的需求。

+0

這看起來非常接近 - 並非所有貨幣都有2位小數(日元中最小的增量爲1),這是否也在區域信息中? – Superman

+1

看起來像指ci.NumberFormat.CurrencyDecimalDigits得到我需要的一切 - 謝謝! – Superman

+0

@Superman很高興知道! –

5

應該通過傳遞來完成的CultureInfo

CultureInfo ci = new CultureInfo("en-GB"); 
amount.ToString("C", ci); 
+4

+ 0。我認爲它不會給@Superman結果看起來合理 - 如果兩個貨幣值使用不同的小數分隔符,則輸出的數字格式部分將不匹配(即USD和EUR將是1.23美元和「Eur」1,23 - 根據讀者的語言環境,其中一個數字看起來像123)。 –

16
public static class DecimalExtension 
{ 
    private static readonly Dictionary<string, CultureInfo> ISOCurrenciesToACultureMap = 
     CultureInfo.GetCultures(CultureTypes.SpecificCultures) 
      .Select(c => new {c, new RegionInfo(c.LCID).ISOCurrencySymbol}) 
      .GroupBy(x => x.ISOCurrencySymbol) 
      .ToDictionary(g => g.Key, g => g.First().c, StringComparer.OrdinalIgnoreCase); 

    public static string FormatCurrency(this decimal amount, string currencyCode) 
    { 
     CultureInfo culture; 
     if (ISOCurrenciesToACultureMap.TryGetValue(currencyCode, out culture)) 
      return string.Format(culture, "{0:C}", amount); 
     return amount.ToString("0.00"); 
    } 
} 

這裏是呼籲FormatCurrency幾個不同的貨幣代碼的結果:

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 
+0

很好的實施。 –

+0

感謝@ weston改進我的代碼:) – jignesh

+2

偉大的代碼片段,但最好使用'c.Name'而不是'c.LCID',因爲您可以獲取特定於機器的[CultureNotFoundExceptions](https://msdn.microsoft.com/zh-cn/ COM/EN-US /庫/ system.globalization.culturenotfoundexception(v = vs.110)的.aspx) –