对于已舍入的小负数,StringFormat出现问题

我正在尝试编写一个字符串格式,将数字舍入或填充到两个小数位,并显示带有括号的负数。 这是在WPF应用程序中,但它适用于任何.net StringFormat用例。 例如:

  • 2.0 – > 2.00
  • -2.0 – >(2.00)
  • 0.01 – > 0.01
  • -0.01 – >(0.01)
  • 0.001 – > 0.00
  • -0.001 – >(0.00)

最后一个,一个非常小的负数舍入到零,是问题所在。 我仍然希望括号表示它是否定的。

我的第一个版本是字符串格式如下:

{0:#,##0.00 ;(#,##0.00)} 

这不起作用,因为它在应用开关正/负之前对数字进行舍入,因此认为0.00不是负数。

然后我尝试了这个,将括号逻辑分成它自己的格式块,在数字之前和之后:

 {0:;(}{0:#,##0.00 ;#,##0.00}{0:;)} 

然而,奇怪的是,这表现出与原始示例相同的行为。 它适用于-0.01,但仍然不显示-0.001的括号。 不知何故,第一个和最后一个令牌必须接受中间数字显示令牌的舍入行为。

有没有人有关于如何格式化的想法,所以它按我想要的方式工作?

当你说;(#,##0.00){0:;(} 。这个值已经四舍五入为0.因此它不能得到你期望的结果。

所以最好在标志为负之前检查标志。

 var value = -0.001M; string decimalFormat = value > 0 ? "{0:#,##0.00}" : "({0:#,##0.00})"; Console.WriteLine(String.Format(decimalFormat, value)); 

选择基于符号的字符串格式之间应该这样做。