在VB.NET中将可为null的双变量转换为String



最近我遇到了一个可为null的double的奇怪行为。由于我需要将一个可为null的变量转换为具有精确设置数字的字符串,所以我使用方法.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

您试图调用的方法不存在。CCD_ 2实际上是CCD_。调用的任何方法都必须是Nullable(Of T)结构的成员。当T可以是非数字类型时,该类型怎么会有一个以数字格式字符串为参数的ToString重载?以下是Nullable(Of T).ToString方法的文档:

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

正如您所看到的,与Double类型不同,没有这样的过载:

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

如果要使用数字格式字符串,则需要一个数字,而Double?不是数字。这里有一种方法,你可以使用它将值格式化为一个数字,如果它是一个,通常是另一个:

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")

EDIIT:

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

value.ToString("0.00000")

实际意思是:

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

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

value.ToString

相当于:

value.ToString()

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

现在,它只需要对括号中的格式字符串执行一些操作。前面的ToString调用返回一个String,您可以对String进行索引,以获得该索引处的Char值,因此它假设这就是您要做的。它将您的格式字符串转换为Integer,然后从该索引的String获得Char。这就是为什么867的值产生8作为输出的原因。您将数字867转换为String,然后将Double?0"0.00000"转换为Integer以获得0,然后从String"867"获得索引0处的Char,即"8"c

所有这些都是因为你没有打开Option Strict On,这告诉系统做出最好的猜测,让糟糕的代码工作。

最新更新