已舍入的小负数的字符串格式问题

本文关键字:字符串 格式 问题 舍入 | 更新日期: 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));

在基于符号的字符串格式之间进行选择应该可以。