在C#中全局更改负数货币数字的格式

17

我们有一个大型的ASP.NET MVC项目,在该项目中,所有输出到屏幕上的数字都被格式化为货币形式(即ToString("c"))。然而,负数却显示为带有括号的形式。例如:

decimal d = -8.88m;
Console.WriteLine(d.ToString("c"));
//outputs $(8.88)

这对我们的用户来说有点烦人,特别是在文本框中。我们有几千个地方向屏幕发送像这样的货币字段,所以我们希望有一种可以全局更改格式的方法。有吗?我看到的所有方法都表明你必须创建一个新的格式化程序,类似于这个:

 string curCulture = System.Threading.Thread.CurrentThread.CurrentCulture.ToString();
 System.Globalization.NumberFormatInfo currencyFormat =
     new System.Globalization.CultureInfo(curCulture).NumberFormat;
 currencyFormat.CurrencyNegativePattern = 1;

我们希望不必更改所有的ToString("c")方法...是否有更好的方法?我的第一个想法是只更改我们的本地设置为澳大利亚,但我意识到日期格式化将会混乱。

3个回答

12

Aliostad离答案很近... 在您的基本控制器中尝试这个:

        System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US");
        modCulture.NumberFormat.CurrencyNegativePattern = 1;
        Thread.CurrentThread.CurrentCulture = modCulture;

4

你走对了方向。但是不需要创建一个新的格式化程序,只需更改当前线程的负数格式:

  // update: dont use this!
  Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyNegativePattern = 1;

当请求被启动时,你可以将此代码放置其中。在ASP.NET中,只有一个线程负责处理请求,因此这将影响到所有的货币格式(除非你自己创建一个新线程,在这种情况下,你可以选择更改它)。 更新 是的,上面的代码无法工作,因为它是只读的!尝试这个:
            Console.WriteLine((-111.98).ToString("c"));
            CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
            CultureInfo newCulture = new CultureInfo(currentCulture.IetfLanguageTag);
            newCulture.NumberFormat.CurrencyNegativePattern = 1;
            Thread.CurrentThread.CurrentCulture = newCulture;
            Console.WriteLine((-111.98).ToString("c"));

我很兴奋,但是这个不起作用——我收到了一个InvalidOperationException……“实例是只读的”。 - Beep beep
嗨Jess,实际上我没有尝试过,而且我怀疑行中的某些内容将是只读的。请看我的更新。 - Aliostad
没错,可以这样做。我标记了另一个人的答案为正确,因为他先回答了。 - Beep beep

0
这个解决方案相比其他答案具有优势,它克隆了系统的其他现有CurrentCulture设置和子设置,而不是将它们重置为命名文化的默认值:
CultureInfo cultureInfo = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
cultureInfo.NumberFormat.CurrencyNegativePattern = 1;
Thread.CurrentThread.CurrentCulture = cultureInfo;

替代方案

这个解决方案有一个额外的优点,它只在系统设置为 en-US 并且系统没有现有的自定义 CurrencyNegativePattern 设置时才会覆盖 CurrencyNegativePattern (除了我上面提到的解决方案的优点):

if (Thread.CurrentThread.CurrentCulture.Name.Equals("en-US", StringComparison.Ordinal)
    && Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyNegativePattern == 0)
{
    CultureInfo cultureInfo = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
    cultureInfo.NumberFormat.CurrencyNegativePattern = 1;
    Thread.CurrentThread.CurrentCulture = cultureInfo;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接