【发布时间】:2014-10-17 09:50:36
【问题描述】:
我想发现并使用 VB.Net 等效项来替换 VB6 中看到的 VbNull 值,但我找不到代表该空值的正确值。
Dim formatProvider As NumberFormatInfo =
DirectCast(CultureInfo.GetCultureInfo("es-ES").NumberFormat.Clone, NumberFormatInfo)
With formatProvider
.NumberDecimalSeparator = Microsoft.VisualBasic.vbNull
End With
Dim pi As String = Math.PI.ToString(String.Empty, formatProvider)
NumberDecimalSeparator 属性不接受空值,但它也接受 vbNull 值并且它工作得很好(分隔符被删除),所以......我想我可以使用重现相同的结果.Net 类库,以避免诉诸 VB6 的事情。
我尝试将vbNull 替换为其他值,但由于我上面提到的属性的空虚限制,所有这些都给出了例外:
""
String.Empty
ControlChars.NullChar()
DBNull.Value.ToString
Nothing
更新
我也尝试了这些假设的解决方案,其中任何一个都会引发空值异常,但它不会给我预期的结果,因为使用它作为分隔符来格式化十进制数字,打印出来的数字会损坏。
Convert.ToChar(0)
Char.ConvertFromUtf32(0)
New String(Char.ConvertFromUtf32(0))
【问题讨论】:
-
.NumberDecimalSeparator = ChrW(&H200B)
-
Hans 建议使用
zero-length space- 这是一个未显示的字符 - fileformat.info/info/unicode/char/200B/index.htm -
VB6 的 VbNull 不会像您认为的那样做。它用于比较对象的 VarType(也就是现代的 GetType)。 VbNull 相当于 NET 中的 Nothing。
-
我没有说它会,我是在解释它是什么。 VB.VBNull 只是常量
1。在 VB6 中,它被使用如下:If VarType(foo) = vbNull来测试空对象。Convert.ToChar(1)将是等效的不可打印控制字符。为了兼容性,VarType和VbNull仍然存在于 NET VB 命名空间中,但建议的 零宽度空间,U+200B 将是干净的 NET 方法。 -
不太确定“完美”。
.NumberDecimalSeparator = Microsoft.VisualBasic.vbNull在 Option Strict 下是非法的。 This shows that 长度相同,只是 what 存储为 char(1) 不同。所以我不知道你所说的PROCESSED是什么意思。嵌入一个控制字符(1,vbNull)对我来说似乎很冒险。
标签: .net vb.net winforms visual-studio vb6