22

在我的项目中有很多地方我尝试使用内置{0:C}货币格式显示货币。如果该数字为负数,则将其包围在括号中的值。我希望它改用负号。

我的 web.config 的文化设置为auto,它解析为en-US.

理想的解决方案是一些全局 web.config 或其他设置,这将使{0:C}显示成为en-US文化的负面标志,但我也愿意接受其他不太棒的解决方案。

4

3 回答 3

21

您必须指定正确的NumberFormatInfo.CurrencyNegativePattern,这可能是 1。

Decimal dec = new Decimal(-1234.4321);
CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
culture.NumberFormat.CurrencyNegativePattern = 1; 
String str = String.Format(culture, "{0:C}", dec);
Console.Write(str);

演示:http: //ideone.com/HxSqT

输出:

-$1,234.43
于 2012-07-27T21:59:43.520 回答
18

我认为这里的答案组合会让你更接近你想要的。

protected void Application_BeginRequest()
{
    var ci = CultureInfo.GetCultureInfo("en-US");

    if (Thread.CurrentThread.CurrentCulture.DisplayName == ci.DisplayName)
    {
        ci = CultureInfo.CreateSpecificCulture("en-US");
        ci.NumberFormat.CurrencyNegativePattern = 1;
        Thread.CurrentThread.CurrentCulture = ci;
        Thread.CurrentThread.CurrentUICulture = ci;
    }
}

如果你不想有任何代码来处理这样的单一文化......我相信你需要建立自己的文化......检查这个问题

于 2012-07-27T22:17:07.393 回答
1

据我了解你的问题。

您想根据文化显示货币格式。

每次您做特定于文化的事情时,.NET 都会查看Thread.CurrentThread.CurrentCultureThread.CurrentThread.CurrentUICulture.

您可以在 ASP.NET 中的 global.asaxBeginRequest方法中设置所需的区域性。

protected void Application_BeginRequest()
{
    var ci = CultureInfo.GetCultureInfo("en-US"); // put the culture you want in here

    Thread.CurrentThread.CurrentCulture = ci;
    Thread.CurrentThread.CurrentUICulture = ci;
}
于 2012-07-27T21:57:19.277 回答