什么是CDbl在做什么?

时间:2010-04-16 12:49:41

标签: vb.net parsing casting type-conversion

直到最近,我还是认为VB.NET中的CDbl(x)操作本质上是一个强制转换(即C#中的VB等价于(double)x);但最近的一项发现显示情况并非如此。

如果我有这个字符串:

Dim s As String = "12345.12345-"

我这样做:

Dim d As Double = CDbl(s)

d将设置为值-12345.12345!现在,不要误会我的意思,这在我的特定场景中很方便;但我不得不承认我对为什么这很有用感到困惑。特别是,我很困惑,因为:

  • Double.Parse无法使用上述输入。
  • Double.TryParse不起作用。
  • Convert.ToDouble不起作用。

CDbl如此聪明?

3 个答案:

答案 0 :(得分:15)

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

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

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

答案 1 :(得分:1)

这一直是CDbl()在Visual Basic 4/5/6中的行为,目前特定于VB.NET(它是内联的,不是框架的一部分),所以它可能只是为了移动的人而保留从早期版本。

(由于从QBasic购买的功能,在.NET之前的版本中非常奇怪。)

答案 2 :(得分:0)

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

我不确定什么系统在数字后使用减号,但似乎CDbl被编程为接受两者。在你所接受的事情中保持自由,以及所有这些。

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