将money格式化为字符串时指定货币

时间:2016-10-04 19:35:34

标签: c#

我想将具有关联货币的数字格式化为特定于语言环境的字符串。标准.ToString("C", CultureInfo.CreateSpecificCulture("xxx"))产生错误的输出,因为它使用的是区域设置的货币,而不是该值实际代表的货币。

我正在寻找一种方法来做JQuery Globalize的工作,但在C#中(参见here,下面的相关表)

                                          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

1 个答案:

答案 0 :(得分: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)获取额外的货币信息。