【问题标题】:Issue with StringFormat for small negative numbers that have been rounded已舍入的小负数的 StringFormat 问题
【发布时间】:2013-10-25 09:28:57
【问题描述】:

我正在尝试编写一个字符串格式,它将数字四舍五入或填充到小数点后两位,并且还显示带有括号的负数。这是在 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 的括号。不知何故,第一个和最后一个标记必须在中间的数字显示标记的舍入行为上有所体现。

有没有人知道如何格式化它以使其按我想要的方式工作?

【问题讨论】:

  • 显然是一个错误。有谁知道这是否已在较新的 .Net 版本中得到修复? (我有.Net 4.0)。有谁知道无需创建专用的 Converter 类即可在 XAML 中工作的解决方法?最后,如果错误得到修复,是否会造成潜在的严重向后兼容性问题?

标签: c# .net string-formatting


【解决方案1】:

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

所以最好在符号为负之前检查它。

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

应该根据符号在字符串格式之间进行选择。

【讨论】:

  • 是的,这将在您指定的代码中工作。不幸的是,我的用途是在 WPF XAML 文件中,所以我无法应用你所说的逻辑 - 我只有字符串格式的字符串可以使用。我仍然不清楚为什么 {0:;(} 令牌会从完全独立的 {0:#,##0.00 ;#,##0.00} 列中获取舍入设置...
  • 如果您使用的是 MVVM 模式,这将不是问题。您应该能够将其绑定到一个属性,该属性可以修改 View Model 的属性获取器中的格式
  • 我可能最终不得不这样做。我不相信这个逻辑应该在视图模型上——它真的是一个演示的东西。 (我还将负值显示为红色,再次用于演示目的)。另一种选择是简单地编写一个转换器类;可惜失去了字符串格式的简单性!
  • 如果你不想使用 MVVM,或者你认为它不属于那里,你总是可以制作一个带有三个参数的自定义 MultiValueConverter。 #1 是价值。 #2 是第一种字符串格式。 #3 是第二种字符串格式。所以只需将逻辑添加到该转换器,并返回#2 或#3 参数
  • @FrankyB 不错,没想到
猜你喜欢
  • 2016-11-03
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多