【问题标题】:Currency format C# ISOCurrencySymbol货币格式 C# ISOCurrencySymbol
【发布时间】:2016-05-23 09:58:42
【问题描述】:

我通常只会使用这个:

double test = 1234.5678;
Console.WriteLine(test.ToString("C"));

效果很好。我对加元进行了“覆盖”,以确保人们能够看到美元和加元之间的差异:

var canadaFi = (NumberFormatInfo)CultureInfo.GetCultureInfo("en-CA").NumberFormat.Clone();
canadaFi.CurrencySymbol = "C$ ";
Console.WriteLine(val.ToString("C", canadaFi));

但现在人们要求输出如下:

1234,56 加元

所以我用了:

RegionInfo ca = new RegionInfo("en-CA");
Console.WriteLine(string.Format("{0} {1}", ca.ISOCurrencySymbol, test.ToString("f2")));

这行得通,但我想知道这是否是最好的方法在浮点/双精度前面获取 3 char iso 货币符号。 所以我现在必须使用RegionInfo,而不是使用CultureInfo

【问题讨论】:

  • 似乎没有“简单”的方法来做到这一点。从stackoverflow.com/a/22837610/1336590 开始,您可能希望将cultureInfo 作为方法的输入参数。然后我有string currencyValue = value.ToString("C", cultureInfo); 来获取“正确”的货币字符串。然后删除货币符号,修剪并添加regionInfoISOCurrencySymbol。 - - 顺便提一句。使用decimal 而不是double 来获取货币价值以避免头痛。
  • 这确实解决了千位分隔符,感谢您的建议!
  • 所以基本上:public static string FormatCurrency(decimal value, CultureInfo cultureInfo) { return string.Concat(new RegionInfo(cultureInfo.LCID).ISOCurrencySymbol, " ", value.ToString("C", cultureInfo).Replace(cultureInfo.NumberFormat.CurrencySymbol, string.Empty).Trim()); } --- 并使用 FormatCurrency(1234.5678m, CultureInfo.GetCultureInfo("en-CA"))FormatCurrency(1234.5678m, CultureInfo.GetCultureInfo("de-DE")) 进行测试
  • 请作为答案发布,以便我给你积分并将其标记为已接受。

标签: c# currency cultureinfo regioninfo


【解决方案1】:

正确的方法是:

const string canada = "en-CA";

var ca = new RegionInfo(canada);
var cai = new CultureInfo(canada)
{
    NumberFormat =
    {
        CurrencySymbol = ca.ISOCurrencySymbol,
        CurrencyPositivePattern = 2,
        CurrencyNegativePattern = 12
    }
};

Console.WriteLine(test.ToString("C", cai));

如果您设置CurrencyPositivePattern = 2,则确保该符号位于数字前面并有一个额外的空格(另请参阅documentation for CurrencyPositivePattern),CurrencyNegativePattern = 12 对负值(documentation for CurrencyNegativePattern)执行相同操作。

输出:

1,234.57 加元

对于否定

加元 -1,234.57

【讨论】:

    【解决方案2】:

    正如@Corak 解释的那样:

    CultureInfo cai = new CultureInfo("en-CA");
    RegionInfo ca = new RegionInfo("en-CA");
    Console.WriteLine(ca.ISOCurrencySymbol + " " + test.ToString("C", cai).Substring(1));
    

    输出:

    1,234.57 加元

    @Coraks 建议添加:

    Console.WriteLine(ca.ISOCurrencySymbol + " " + test.ToString("C", cai).Replace(cai.CurrencySymbol, ""));
    

    【讨论】:

    • 对于货币符号不在(直接)在值前面的文化,这将失败。以"de-DE" 为例。
    • 没错,必须使用.Replace(cai.CurrencySymbol, "") 而不是.Substring(1)。感谢这个好建议!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    相关资源
    最近更新 更多