已舍入的小负数的字符串格式问题
本文关键字:字符串 格式 问题 舍入 | 更新日期: 2023-09-27 18:36:47
我正在尝试编写一种字符串格式,该格式将数字四舍五入或填充到小数点后两位,并且还显示带有括号的负数。这在 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));
在基于符号的字符串格式之间进行选择应该可以。