首页 > 解决方案 > 在 VB.NET 中将可为空的双精度变量转换为字符串

问题描述

最近我遇到了一个可以为空的双精度的奇怪行为。因为我需要将一个可为空的变量转换为具有精确设置数字的字符串,所以我正在使用方法.ToString(format)。当我将此方法应用于上述可空变量而不是根据需要获取转换后的数字时,我只得到该数字的第一个数字(示例如下)。当然,我可以将 nullable 转换为 double 并解决它,但为什么会发生这种情况。非常感谢您的意见。

例子:

'Nullable Double
Dim value As Double? = 867
Dim convertedValue As String = value.ToString("0.00000")
Console.WriteLine(convertedValue)
'Output: 8

'Not nullable Double
Dim value As Double = 867
Dim convertedValue As String = value.ToString("0.00000")
Console.WriteLine(convertedValue)
'Output: 867.00000

标签: stringvb.netdoublenullable

解决方案


您尝试调用的方法不存在。ADouble?实际上是一个Nullable(Of Double). 您调用的任何方法都必须是该Nullable(Of T)结构的成员。当可能是非数字类型时,该类型如何具有ToString将数字格式字符串作为参数的重载?T这是该Nullable(Of T).ToString方法的文档:

https://docs.microsoft.com/en-au/dotnet/api/system.nullable-1.tostring?view=net-5.0

如您所见,与类型不同,没有这样的重载Double

https://docs.microsoft.com/en-au/dotnet/api/system.double.tostring?view=net-5.0

如果要使用数字格式字符串,则需要一个数字,而 aDouble?不是数字。您可以使用以下方法将值格式化为数字(如果为 1),否则通常为:

Private Function FormatNullableDouble(number As Double?, format As String) As String
    Return If(number.HasValue,
              number.Value.ToString(format),
              number.ToString())
End Function

你可以这样称呼它:

Dim convertedValue As String = FormatNullableDouble(value, "0.00000")

编辑:

需要明确的是,因为你有Option Strict Off,编译器会忽略你的代码没有意义,并假设它会在运行时。当运行时间到来时,系统会尽最大努力寻找使其工作的方法。它实际上想出的是:

value.ToString("0.00000")

实际上是这个意思:

value.ToString().Chars(CInt("0.00000"))

在 VB 中,如果没有参数,您可以在方法调用中省略括号,因此:

value.ToString

相当于:

value.ToString()

通过假设您省略了括号,系统可以使该ToString调用有意义,因此它会这样做。

现在它只需要对括号中的格式字符串做一些事情。前面的ToString调用返回 aString并且您可以索引 aString以获取Char该索引处的值,因此它假定这就是您要执行的操作。它将您的格式字符串转换为an Integer,然后Char从该String索引处获取。这就是为什么 867 的值会产生 8 作为输出。您正在将数字 867 转换为 a String,然后将 the 转换String "0.00000"为 anInteger以获得 0,然后从 中获取Charat 索引 0 String "867",即"8"c

所有这一切都是因为您没有转而发生Option Strict On的,这告诉系统做出最好的猜测,以使错误的代码正常工作。


推荐阅读