我们有一个大型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”)方法...有更好的方法吗?我的第一个想法是将我们的语言环境改为澳大利亚,但意识到日期格式化将被搞砸。
答案 0 :(得分:11)
Aliostad很接近......在您的基地控制器中试试这个:
System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US");
modCulture.NumberFormat.CurrencyNegativePattern = 1;
Thread.CurrentThread.CurrentCulture = modCulture;
答案 1 :(得分: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"));