【问题标题】:Custom numeric decimal format自定义数字十进制格式
【发布时间】:2015-06-11 16:14:30
【问题描述】:

问题:

我想用未确定的小数精度格式化 Double 数字(例如 value.ToString("n2") ),但在所有小数为 0 的情况下消除/丢弃小数, 或者换句话说,如果所有小数都为零,则返回整数字符串而不是十进制字符串。

问题:

如何解决上面解释的十进制格式问题? (请参阅备注)

预期结果:

此代码将产生字符串1,00,但它应该产生字符串1:

Dim value As Double = 1.0R
Dim format As String = value.ToString("n2", CultureInfo.CurrentCulture.NumberFormat)
Debug.WriteLine(format)

此代码将生成字符串1,01,不需要更改,因为它有一个非零小数:

Dim value As Double = 1.01R
Dim format As String = value.ToString("n2", CultureInfo.CurrentCulture.NumberFormat)
Debug.WriteLine(format)

另一个小数精度为 2 的预期格式示例:

1
1,01
...
1,09
1,10 - Note the last zero is not eaten.
1,11
...
2

研究:

我一直在 MSDN 上阅读这些文档,但我没有看到如何解决这个问题。

Double.ToString Method (String)

Standard Numeric Format Strings

Custom Numeric Format Strings

NumberFormatInfo.NumberDecimalDigits Property .

备注:

· 我正在寻找适当且有效的方法来执行此操作,我知道在结果字符串上执行Substring 或类似的操作来搜索或计算结果零。

· 如果这很重要,我想继续使用我当前文化的NumberFormat。

· 我将澄清,在我的真实场景中,我使用的是随机数,那么我不知道要格式化的值是小数点为零 (1,00) 还是非零小数点 (1,99) 和/或其十进制精度/长度。

【问题讨论】:

    标签: .net vb.net formatting tostring numeric


    【解决方案1】:

    您可以使用"0.##" 之类的格式字符串:

    Dim values = {1.0000R, 1.0R, 1.1R, 1.100R}
    For Each value in values
        Debug.WriteLine(value.ToString("0.##", CultureInfo.CurrentCulture.NumberFormat))
    Next
    

    输出将是1、1、1.1 和1.1,这似乎是您想要的(精度损失可能是也可能不是您想要的)。

    这是一种带有数字占位符的自定义数字格式,如下所示:Custom Numeric Format Strings。

    另一种选择是Standard Numeric Format Strings;尤其是 general format specifier,您可以在没有精度说明符的情况下使用它(可能是也可能不是您想要的)。


    回应您的编辑/评论:

    您无法使用简单的单一格式字符串,但您可以使用如下简单的解决方法:

    value.ToString(If(Math.Abs(value mod 1) < Double.Epsilon, "0", "0.00"), CultureInfo.CurrentCulture.NumberFormat)
    

    【讨论】:

    • 谢谢,但它不会产生预期的结果,例如1,10,它会吃掉最后一个0。我已经用另一个预期结果示例更新了我的问题。
    • 我做不到,我的数字非常大(PB 计算),似乎是一个好方法,但转换为容量小于Double 的数字数据类型会产生溢出,它可能是解决了吗?
    • 对于全为零的小数,我仍然得到零,这是我的代码的调试输出:1099511727776 Bytes rounded to 1,00 TeraBytes 我正在使用您上次的代码格式更新,它应该将1,00 格式化为1 :(
    • 您上次的代码更新似乎返回了与刚刚执行 "N2" 相同的格式,但无论如何,感谢您的时间,我辞职执行子字符串或 like 运算符。跨度>
    • 我以为你总是有 2 位小数? "0.00" 会将数字减少到小数点后两位。如果您想要更多,但至少需要 2 个,请使用“0.00##########”。
    【解决方案2】:
    value.ToString("G2")
    

    这应该可以工作

    【讨论】:

    • 我注意到,与“N”格式相比,我应该将“G”的精度增加 +1,当 +1 增加时,你的答案很好,它以更简单的方式产生与 @sloth 答案相同的结果,但它也有同样的缺点,它会吃掉最后的零。
    猜你喜欢
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2018-06-10
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    相关资源
    最近更新 更多