关于vb.net:CDbl在做什么?

What is CDbl doing?

直到最近,我才对VB.NET中的CDbl(x)操作本质上是强制转换(即,在C#中等于(double)x的VB)印象深刻; 但是最近的发现表明事实并非如此。

如果我有这个字符串:

1
Dim s As String ="12345.12345-"

我这样做:

1
Dim d As Double = CDbl(s)

d将设置为值-12345.12345! 现在,请不要误会我的意思,在我的特定情况下这很方便; 但是我不得不承认我对为什么这样做感到困惑。 特别是,我感到困惑是因为:

  • Double.Parse不适用于以上输入。
  • Double.TryParse不起作用。
  • Convert.ToDouble不起作用。

CDbl怎么这么聪明?


它使用Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble()。该函数在对象的GetTypeCode()返回值上包含一个Select语句,因此它可以基于参数的类型使用自定义转换器。字符串转换器考虑字符串可能包含货币值的可能性,并对字符串进行一些处理以解决该问题。货币值的一种允许格式是尾随负号。

这不是特别便宜。实现相同转换的最快方法是:

1
2
Dim s As String ="12345.12345-"
Dim d As Double = Double.Parse(s, Globalization.NumberStyles.Any)


在Visual Basic 4/5/6中,这始终是CDbl()的行为,并且当前特定于VB.NET(它是内联的,不是框架的一部分),因此对于从较早版本迁移的人们来说,它可能一直保留着。

(由于从QBasic购买了功能,因此与.NET Visual Basic以前的版本很奇怪。)


如果进入"控制面板"中的"区域选项",则有一个设置让您将减号放在数字之后,而不是之前。

我不确定哪个系统在数字后使用减号,但是似乎CDbl已编程为接受两者。在接受和所有方面保持开放。

区域选项还在括号中的负数设置。那样有用吗? -CDbl("(12345.12345)")