首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VB.NET中可空双变量到字符串的转换

VB.NET中可空双变量到字符串的转换
EN

Stack Overflow用户
提问于 2020-11-26 00:03:47
回答 1查看 371关注 0票数 0

最近,我遇到了一种奇怪的行为,那就是一个可为空的替身。由于我需要将一个可空变量转换为具有精确设置数字的字符串,所以我使用的是.ToString(format)方法。当我将此方法应用于上述可空变量而不是根据我的需要得到转换的数字时,我只得到这个数字的第一个数字(例如给出了下面的例子)。当然,我可以将空值转换成双倍,它可以解决这个问题,但是为什么会这样呢?非常感谢您的投入。

示例:

代码语言:javascript
运行
复制
'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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-26 00:16:37

你要调用的方法根本不存在。Double?实际上是Nullable(Of Double)。您调用的任何方法都必须是Nullable(Of T)结构的成员。当ToString可以是非数字类型时,该类型怎么会有一个以数字格式字符串作为参数的T重载?下面是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?不是数字。下面是一种方法,如果它是数字,则可以使用它将值格式化为数字,而通常情况下是这样:

代码语言:javascript
运行
复制
Private Function FormatNullableDouble(number As Double?, format As String) As String
    Return If(number.HasValue,
              number.Value.ToString(format),
              number.ToString())
End Function

你可以这样说:

代码语言:javascript
运行
复制
Dim convertedValue As String = FormatNullableDouble(value, "0.00000")

EDIIT:

要明确的是,因为您有Option Strict Off,编译器忽略了您的代码没有意义,并假设它在运行时会这样做。当运行时到来时,系统会尽最大努力找到一种使其工作的方法。它真正得出的结论是:

代码语言:javascript
运行
复制
value.ToString("0.00000")

实际上指的是:

代码语言:javascript
运行
复制
value.ToString().Chars(CInt("0.00000"))

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

代码语言:javascript
运行
复制
value.ToString

相当于:

代码语言:javascript
运行
复制
value.ToString()

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

现在,它只需要对括号中的格式字符串做一些事情。前面的ToString调用返回一个String,您可以索引一个String以在该索引上得到一个Char值,所以它假设这就是您要做的。它将格式字符串转换为Integer,然后从索引处的String获取Char。这就是为什么值为867会产生8作为输出。您正在将数字867转换为String,然后将String "0.00000"转换为Integer以获取0,然后从String "867" (即"8"c )获取索引0处的Char

这一切之所以发生,是因为您没有打开Option Strict On,它告诉系统尽最大努力使坏代码正常工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65014376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档