2010-04-16 14 views
11

Hasta hace poco tiempo tenía la impresión de que la operación CDbl(x) en VB.NET era esencialmente una conversión (es decir, el equivalente de VB de (double)x en C#); pero un descubrimiento reciente ha revelado que este no es el caso.¿Qué está haciendo CDbl?

Si tengo esta cadena:

Dim s As String = "12345.12345-" 

Y hago esto:

Dim d As Double = CDbl(s) 

d se establecerá en el valor -12345.12345! Ahora, no me malinterpreten, esto es bastante conveniente en mi situación particular; pero tengo que admitir que estoy confundido en cuanto a por qué esto funciona. En particular, estoy confundido porque:

  • Double.Parse no funciona con la entrada anterior.
  • Double.TryParse no funciona.
  • Convert.ToDouble no funciona.

¿Cómo es CDbl tan inteligente?

Respuesta

14

Utiliza Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(). Esa función contiene una declaración Select en el valor de retorno GetTypeCode() del objeto para que pueda usar un convertidor personalizado basado en el tipo de argumento. El convertidor de cadenas considera la posibilidad de que la cadena pueda contener un valor de moneda y hace algún procesamiento en la cadena para manejar eso. Un formato permitido para los valores de moneda es un signo negativo final.

Esto no es particularmente barato. La forma más rápida de lograr la misma conversión es:

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

Gracias por la respuesta en profundidad. Como programador de VB6 que se convirtió a .NET, siempre traté de hacer las cosas "a la manera .NET" en lugar de utilizar la antigua función vb. Por ejemplo: .substring en lugar de Left, Mid, Right, .ToLower en lugar de LCase, etc. – Jeremy

0

Si va a Opciones regionales en el Panel de control, hay una configuración que le permite colocar el signo menos después de, en lugar de antes, los números.

No estoy seguro de qué sistema utiliza un signo menos después de los números, pero parece que CDbl está programado para aceptar ambos. Sé liberal en lo que aceptas, y todo eso.

Opciones regionales también tiene una configuración para números negativos donde están entre paréntesis. ¿Eso funciona? - CDbl("(12345.12345)")

1

Ese siempre ha sido el comportamiento de CDbl() en Visual Basic 4/5/6 y actualmente es específico de VB.NET (está en línea, no es parte del framework), por lo que probablemente solo se haya guardado para personas en movimiento de versiones anteriores.

(Al igual que en la rareza pre-.NET Visual Basic debido a las características de comprar sin QBasic.)

Cuestiones relacionadas