簡體   English   中英

根據貨幣代碼將十進制格式設置為貨幣

[英]Format decimal as currency based on currency code

我有一張包含金額和貨幣代碼(美元,日元,加元,歐元等)的收費表,並且正在尋找最簡單的方法來正確格式化貨幣。 使用我的當地文化代碼(美國)並使用我的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”]),該格式將在我的本地上下文中輸出逗號分隔符,但會自動將正確的貨幣符號和小數位放入。

讓我知道是否有人有更清潔的方法,否則我會在短期內將喬恩的答案標記為正確。

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

應該通過傳遞CultureInfo來完成:

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

您可以構建一個字典,將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 vs 1,00)。 使用哪種取決於您的需求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM