2

我在将数字转换为 IFormattable 时遇到问题,对其调用 ToString(...) 并传递 from 的 FormatCode0.000;-;0表示如果数字为正,我想显示三位小数的精度,显示“- " 如果为负数,如果为零则显示为零(没有三位小数的精度)。如果数字的大小不超过 0.5,则该数字的负性不被拾取。

这是我的 FormattedValue 的公共访问器:

public string FormattedValue
{
    get
    {
        if (Value is IFormattable)
        {
            return (Value as IFormattable)
                       .ToString(FormatCode,
                                 System.Threading.Thread.CurrentThread.CurrentUICulture);
        }
        else
        {
            return Value.ToString();
        }
    }
}

例如,如果我执行该行

(-0.5 as IFormattable)
    .ToString("0.000;-;0", 
              System.Threading.Thread.CurrentThread.CurrentUICulture)

我得到了我的期望:“-”。但是,当我传入稍微低一点的东西时,比如说,

(-0.499 as IFormattable)
    .ToString("0.000;-;0", 
              System.Threadings.Thread.CurrentThread.CurrentUICulture)

我得到“0”返回。

有谁知道为什么这不起作用?这非常重要,因为我试图以这种方式格式化的许多值将比这种方法似乎工作的值要小。有什么办法能让我按照我想要的方式工作吗?谢谢!

更新

这最终为我工作:

Math.Abs(value) < 0.0005
    ? value.ToString("0.000")
    : value.ToString("0.000;-;-");
4

1 回答 1

2

问题是使用“-”会导致它被视为具有零精度,它会四舍五入到 -0,这实际上是 0。这会导致它根据零大小写进行格式化。 来自自定义格式的文档

如果要格式化的数字非零,但根据第一节或第二节的格式四舍五入后变为零,则根据第三节的格式对生成的零进行格式化。

于 2014-05-01T22:50:30.140 回答