代码之家  ›  专栏  ›  技术社区  ›  Beep beep

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

  •  17
  • Beep beep  · 技术社区  · 15 年前

    我们有一个大型的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”)方法…有更好的方法吗?我的第一个想法是把我们的地点改成澳大利亚,但意识到日期格式会被搞砸。

    2 回复  |  直到 14 年前
        1
  •  11
  •   user268137    15 年前

    阿利奥斯塔德很接近…在基本控制器中尝试此操作:

            System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US");
            modCulture.NumberFormat.CurrencyNegativePattern = 1;
            Thread.CurrentThread.CurrentCulture = modCulture;
    
        2
  •  4
  •   Aliostad    15 年前

    你走对了。但不创建新的格式化程序,而是更改当前线程的负格式:

      // 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"));
    
    推荐文章