Dan Tao Dan Tao - 3 months ago 14
Vb.net Question

What is CDbl doing?

I had until recently been under the impression that the

CDbl(x)
operation in VB.NET was essentially a cast (i.e., the VB equivalent of
(double)x
in C#); but a recent discovery has revealed that this is not the case.

If I have this string:

Dim s As String = "12345.12345-"


And I do this:

Dim d As Double = CDbl(s)


d
will be set to the value
-12345.12345
! Now, don't get me wrong, this is kind of convenient in my particular scenario; but I have to admit I'm confused as to why this works. In particular, I'm confused because:


  • Double.Parse
    does not work with the above input.

  • Double.TryParse
    does not work.

  • Convert.ToDouble
    does not work.



How is
CDbl
so clever?

Answer

It uses Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(). That function contains a Select statement on the object's GetTypeCode() return value so it can use a custom converter based on the type of the argument. The string converter considers the possibility that the string might contain a currency value and does some processing on the string to deal with that. One allowed format for currency values is a trailing negative sign.

This is not particularly cheap. The quickest way to achieve the same conversion is:

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