在 VB.NET 中将可空双精度变量转换为字符串

Conversion of nullable double variable to String in VB.NET

最近我遇到了可空双精度的奇怪行为。因为我需要将可空变量转换为具有精确设置数字的字符串,所以我使用方法 .ToString(format)。当我将此方法应用于上述可为 null 的变量而不是根据需要获取转换后的数字时,我仅获取此数字的第一位数字(示例如下所示)。当然,我可以将 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

您尝试调用的方法不存在。一个Double?实际上是一个Nullable(Of Double)。您调用的任何方法都必须是 Nullable(Of T) 结构的成员。当 T 可能是非数字类型时,该类型怎么会有一个 ToString 重载将数字格式字符串作为参数?这是 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

如果您想使用数字格式字符串,则需要一个数字,而 Double? 不是数字。您可以使用以下方法将值格式化为数字(如果它是 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 调用 returns a String 并且您可以索引 a String 以获得该索引处的 Char 值,因此它假定这就是您正在尝试做。它将您的格式字符串转换为 Integer,然后从该索引处的 String 获取 Char。这就是 867 的值产生 8 作为输出的原因。您正在将数字 867 转换为 String,然后将 String "0.00000" 转换为 Integer 以获得 0,然后在索引 0 处获得 Char来自 String "867",即 "8"c.

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