2016-10-04 238 views
2

我想將具有關聯貨幣的數字格式化爲特定於區域設置的字符串。標準.ToString("C", CultureInfo.CreateSpecificCulture("xxx"))產生錯誤的輸出,因爲它使用語言環境的貨幣而不是該值實際表示的貨幣。將貨幣格式化爲字符串時指定貨幣

我正在尋找一個方式做什麼的JQuery Globalize的做法,但在C#中(見here,relavent見下表)

 
              Locale 
         ----------------------------------------- 
3-letter currency code | en (English) | de (German) | zh (Chinese) 
---------------------- | ------------ | ----------- | ------------ 
USD     | $1.00  | 1,00 $  | US$ 1.00 
EUR     | €1.00  | 1,00 €  | € 1.00 
CNY     | CN¥1.00  | 1,00 CN¥ | ¥ 1.00 
JPY     | ¥1   | 1 ¥   | JP¥ 1 
GBP     | £1.00  | 1,00 £  | £ 1.00 
BRL     | R$1.00  | 1,00 R$  | R$ 1.00 
+0

你的代碼例如'1.ToString(「C」,System.Globalization.CultureInfo.CreateSpecificCulture(「fr-FR」))'產生100歐元的輸出,而「en-US」產生1.00美元的結果 你到底在想什麼? – GauravKP

+0

我有1美元。我想爲它的區域設置fr-FR進行格式化。 '1.ToString(「C」,CultureInfo.CreateSpecificCulture(「fr-F R」))'給出「100歐元」,這是錯誤的貨幣。我想獲得「1,00 $」 – flipchart

+0

瞭解,這將有助於https://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.numberdecimalseparator(v=vs.110).aspx – GauravKP

回答

4
string FormatCurrency(decimal value, string currencyCode, string locale) 
{ 
    var culture = CultureInfo.CreateSpecificCulture(locale); 
    var numberFormat = (NumberFormatInfo) culture.NumberFormat.Clone(); 
    var currencySymbol = CultureInfo.GetCultures(CultureTypes.AllCultures) 
            .Where(ci => ci!=CultureInfo.InvariantCulture) 
            .Select(c =>{try{return new RegionInfo(c.LCID);} 
                catch{return null;}}) 
            .Where(ri=>ri!=null && 
               ri.ISOCurrencySymbol==currencyCode) 
            .Select(ri => ri.CurrencySymbol) 
            .First(); 
    numberFormat.CurrencySymbol = currencySymbol; 
    return value.ToString("C",numberFormat); 
} 

FormatCurrency(1m,"USD","de")回報"1,00 $"等,但不區分CN¥JP¥,或任何地區的任何類似的東西。貨幣符號仍然是其原生區域使用的貨幣符號。您可以從Unicode Common Locale Data Repository (CLDR)獲得額外的貨幣信息。