在 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
,这会告诉系统尽可能做出最好的猜测,以使错误的代码正常工作。
最近我遇到了可空双精度的奇怪行为。因为我需要将可空变量转换为具有精确设置数字的字符串,所以我使用方法 .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
,这会告诉系统尽可能做出最好的猜测,以使错误的代码正常工作。