根据货币代码将十进制格式化为货币

我有一个收费表,金额和货币代码(美元,日元,加元,欧元等),我正在寻找正确格式化货币的最简单方法。 使用我的本地文化代码(美国)并获取我的decimal.ToString(“c”)得到我$ 0.00输出,但我想要正确的货币符号和基于代码的小数位数。

是否存在任何库? 我当然可以为每个语句编写一个switch语句和自定义规则,但我认为这必须在之前完成。

更新:

我修改了Jon B的示例代码,如下所示

static IDictionary GetCurrencyFormatStrings() { var result = new Dictionary(); 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(Currency [“JPY”]),格式将在我的本地上下文中输出逗号分隔符,但是自动输入正确的货币符号和小数位。

让我知道是否有人有更清洁的方式这样做,或者我很快就会将Jon的答案标记为正确。

您可以构建一个字典,从ISO货币符号(USD)到货币符号($):

 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 GetCurrencySymbols() { var result = new Dictionary(); 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 vs 1,00)。 无论您使用哪种,都取决于您的需求。

 public static class DecimalExtension { private static readonly Dictionary 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 

应该通过传递CultureInfo来完成:

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