自定义数字十进制格式

Custom numeric decimal format

问题:

我想格式化一个 Double 具有未确定的小数精度的数字(例如 value.ToString("n2") )但是 eliminating/discarding 所有小数的小数都是 0, 或者换句话说,return 一个整数字符串而不是一个十进制字符串,如果它的所有小数都是零。

问题:

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

预期结果:

此代码将生成字符串 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) and/or 其小数 precision/length。

您可以使用类似 "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

输出会是111.11.1,这似乎是你想要的(精度损失可能是也可能不是什么你想要)。

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

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


回应您的edit/comment:

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

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

这应该有效