string - 在 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
解决方案
您尝试调用的方法不存在。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,然后从 中获取Char
at 索引 0 String
"867"
,即"8"c
。
所有这一切都是因为您没有转而发生Option Strict On
的,这告诉系统做出最好的猜测,以使错误的代码正常工作。
推荐阅读
- node.js - 如何结束node js应用程序并杀死终端
- c# - 将数据从 C# 写入 MDF 数据库
- c# - Redis 中具有分布式会话处理的 ASP.Net Core web-farm
- data-binding - 用户如何选择在 Xamarin 中的单个标签上显示两个(或多个)字段中的一个
- azure-devops - 是否可以将 git 存储库分组到 AzureDevOps 下的子文件夹中?
- java - 如何使用一些过滤器来消费来自 Kafka 主题的消息?
- python - 将列元组转换为字符串
- python - 将一个热编码列转换为分类标签
- inno-setup - 使用 C# 在我的应用程序中安装字体
- php - Symfony 5 如何在编辑表单中显示图像