自定义数字十进制格式
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
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
输出会是1
、1
、1.1
和1.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")
这应该有效
问题:
我想格式化一个 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
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
输出会是1
、1
、1.1
和1.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")
这应该有效