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

时间:2013-10-25 09:28:57

标签: c# .net string-formatting

我正在尝试编写一个字符串格式,将数字舍入或填充到两位小数,并显示带有括号的负数。这是在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的括号。不知何故,第一个和最后一个令牌必须接受中间数字显示令牌的舍入行为。

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

1 个答案:

答案 0 :(得分:2)

当您说;(#,##0.00){0:;(}时。该值已经四舍五入为0.因此,它无法获得您期望的结果。

因此最好先检查标志是否为负值。

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

选择基于符号的字符串格式。