根据货币代码将货币格式设置为货币

问题描述:

我有一个包含金额和货币代码(美元,日元,加元,欧元等)的费用表,并且正在寻找正确格式化货币的最简单方法。使用我的本地文化代码(美国),并采取我的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

你可以建立一个字典从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很高兴知道! –

应该通过传递来完成的CultureInfo

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

+ 0。我认为它不会给@Superman结果看起来合理 - 如果两个货币值使用不同的小数分隔符,则输出的数字格式部分将不匹配(即USD和EUR将是1.23美元和“Eur”1,23 - 根据读者的语言环境,其中一个数字看起来像123)。 –

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) –