自定义数字小数格式

时间:2015-04-07 06:34:18

标签: .net vb.net formatting tostring numeric

问题:

我想格式化带有未确定小数精度的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)和/或其小数精度/长度。

2 个答案:

答案 0 :(得分: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

输出将是111.11.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 :(得分:1)

value.ToString("G2")

这应该有效