对于已舍入的小负数,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));
选择基于符号的字符串格式之间应该这样做。