8

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

有没有为此而存在的库?我当然可以为每个语句编写一个 switch 语句和自定义规则,但我认为这一定是以前做过的。

更新:

我修改了 Jon 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(Currency["JPY"]),格式将在我的本地上下文中输出逗号分隔符,但会自动输入正确的货币符号和小数位。

让我知道是否有人有更清洁的方法,否则我会很快将 Jon 的答案标记为正确。

4

3 回答 3

29
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
于 2015-06-03T18:56:21.960 回答
5

应该通过传递来完成CultureInfo

CultureInfo ci = new CultureInfo("en-GB");
amount.ToString("C", ci);
于 2012-11-13T16:52:36.057 回答
2

您可以构建一个字典以从 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<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)。使用哪种取决于您的需求。

于 2012-11-13T17:54:15.650 回答