C# 根据货币代码将十进制设置为货币格式

C# 根据货币代码将十进制设置为货币格式,c#,format,currency,tostring,C#,Format,Currency,Tostring,我有一个收费表的金额,和货币代码(美元,日元,加元,欧元等),并寻找最简单的方法来正确格式化货币。使用我的本地文化代码(美国)并使用我的decimal.ToString(“c”)可以得到0.00美元的输出,但我希望根据代码得到正确的货币符号和小数位数 是否存在用于此目的的库?我当然可以为每一个编写一个switch语句和自定义规则,但我想这一定是以前做过的 更新: 我修改了JonB的示例代码如下 static IDictionary<string, string> GetCurrenc

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

是否存在用于此目的的库?我当然可以为每一个编写一个switch语句和自定义规则,但我想这一定是以前做过的

更新:

我修改了JonB的示例代码如下

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;
}
静态IDictionary GetCurrencyFormatString()
{
var result=newdictionary();
foreach(CultureInfo.GetCultures(CultureTypes.AllCultures)中的var ci)
{
尝试
{
var ri=新的RegionInfo(ci.Name);
结果[ri.等电流符号]=
string.Format(“{0}#,#0.{1};({0}#,#0.{1})”,
国际货币符号,
新字符串('0',
i、 数字格式(货币小数位数);
}
捕获{}
}
返回结果;
}
这使我可以简单地转到Amount.ToString(Currency[“JPY”]),该格式将在本地上下文中输出逗号分隔符,但会自动将正确的货币符号和小数点放入


如果有人有更干净的方法,请告诉我,否则我会很快将Jon的答案标记为正确。

应该通过传递
文化信息来完成:

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

您可以构建一个字典,将ISO货币符号(USD)转换为货币符号($):

static void Main(字符串[]args)
{
var symbols=GetCurrencySymbols();
Console.WriteLine(“{0}{1:0.00}”,符号[“USD”],150万美元);
Console.WriteLine(“{0}{1:0.00}”,符号[“JPY”],1.5M);
Console.ReadLine();
}
静态IDictionary GetCurrencySymbols()
{
var result=newdictionary();
foreach(CultureInfo.GetCultures(CultureTypes.AllCultures)中的var ci)
{
尝试
{
var ri=新的RegionInfo(ci.Name);
结果[ri.ISOCurrencySymbol]=ri.CurrencySymbol;
}
捕获{}
}
返回结果;
}
这是基本的想法,你需要调整它以满足你的需要

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");
    }
}

请注意,您当然可以使用
CultureInfo
类将特定区域性转换为字符串,但正如Alexei的注释所述,这将导致每个字符串略有不同(如1.00对1,00)。你使用哪一种取决于你的需要。

@AakashM-实际上它确实存在。它叫做
CultureInfo
。收回我之前的评论,我注意到,因此框架确实对这些有一些了解。我想您必须进行迭代,因为我没有看到任何基于货币代码的查找。@Ramhound
CultureInfo
告诉您如何在给定的区域性中设置货币数量的格式。它没有告诉你日元的符号是¥。看这里?[货币ISO代码的上一个问题][1][1]:+0。我不认为它会给出看起来合理的@Superman结果-如果两个货币值使用不同的十进制分隔符,输出的数字格式部分将不匹配(即美元和欧元将分别为1.23美元和1.23欧元-其中一个数字在读者看来会像123,具体取决于读者的语言环境)。这看起来非常接近-并非所有货币都有2位小数(日元的最小增量为1),这是否也在区域信息中?看起来参考ci.NumberFormat.CurrencyDecimalDigits可以获得我所需的一切-谢谢!像印度这样有14种语言、多种货币符号(取决于语言)和多种货币格式(同样取决于语言)的国家会出现问题。此外,@Superman可能不想在印度的
RegionInfo
रु)表示印度卢比;我怀疑他的客户/用户更喜欢看到特定文化的货币符号“en-IN”(
Rs.
),而不是他们最可能读作“squiggle”的东西。做好这件事很难,需要大量的文化知识。很好的片段,但最好使用
c.Name
而不是
c.LCID
,因为你可以得到特定于机器的感谢@ChadHedgcock,你让我开心!这是一个很好的例子,但是当你需要它的时候,它是非常有用的。非常感谢jignesh和@ChadHedgcock。
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");
    }
}
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