我想格式化带有未确定小数精度的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
NumberFormatInfo.NumberDecimalDigits Property 。
·我正在寻找正确有效的方法,我知道在结果字符串上执行Substring
或类似的事情来搜索或计算结果的零。
·如果重要的话,我想继续使用我当前的文化NumberFormat
。
·我将澄清在我的实际场景中我使用的是随机数,然后我不知道格式化的值是否具有零小数(1,00)或非零小数(1,99)和/或其小数精度/长度。
答案 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
输出将是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 :(得分:1)
value.ToString("G2")
这应该有效