2016-10-04 183 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)获得额外的货币信息。