visual significa que funciones funcion conversion cint cdbl vb6 casting isnumeric

significa - VB6 ¿Puede IsNumeric estar equivocado?



isnumeric visual basic (10)

¿Es posible probar una cadena con IsNumeric () y devolverla como verdadera, pero cuando la conviertes en un entero que usa CInt () y la asigna a una variable de tipo entero que dará un error de tipo?

Pregunto porque estaba recibiendo un error de desajuste de tipo, así que utilicé IsNumeric () para comprobar que la cadena era numérica antes de tratar de lanzarlo, pero sigo recibiendo el error.

Me estoy arrancando los pelos con esto.

Aquí está el código en cuestión. iGlobalMaxAlternatives = CInt(strMaxAlternatives) es donde iGlobalMaxAlternatives = CInt(strMaxAlternatives) el error.

Dim strMaxAlternatives As String Dim iGlobalMaxAlternatives As Integer iGlobalMaxAlternatives = 0 bSurchargeIncInFare = True strMaxAlternatives = ReadStringKeyFromRegistry("Software/TL/Connection Strings/" & sConn & "/HH", "MaxAlt") If IsNumeric(strMaxAlternatives) And strMaxAlternatives <> "" Then iGlobalMaxAlternatives = CInt(strMaxAlternatives) End If


Dos opciones...

Cambio

If IsNumeric(strMaxAlternatives) And strMaxAlternatives <> "" Then iGlobalMaxAlternatives = CInt(strMaxAlternatives) End If

A

If IsNumeric(strMaxAlternatives) And strMaxAlternatives <> "" Then iGlobalMaxAlternatives = CDbl(strMaxAlternatives) '' Cast to double instead'' End If

O

If IsNumeric(strMaxAlternatives) And strMaxAlternatives <> "" Then If CDbl(strMaxAlternatives) Mod 1 = 0 Then '' Make sure there/'s no decimal points'' iGlobalMaxAlternatives = CInt(strMaxAlternatives) End If End If


El siguiente código funciona sin un error de Tipo de coincidencia en Visual Basic 6

Dim I As Integer I = CInt("3.41")

Lo mismo para esta variante

Dim I As Integer Dim TempS As String TempS = "3.41" I = CInt(TempS)

Publicar el código en cuestión ayudaría a responder su pregunta. Básicamente, hay varias funciones en VB6 que se usan para convertir cadenas en números.

CInt e Int se convierten en números pero manejan el redondeo diferente. La asignación directa funciona y es equivalente a usar CInt. Sin embargo, recomiendo continuar usando CInt para que la operación quede clara para usted y sus compañeros desarrolladores en el futuro.

CInt trabaja en números con comas como "3,041.41". Sin embargo, VB6 tiene problemas para manejar la configuración regional, por lo que si usa notación distinta al inglés americano estándar obtendrá extraños resultados y errores.


Es posible que tenga un desbordamiento debido al tamaño entero máximo; el tipo de moneda realmente funciona muy bien para grandes cantidades (pero ten cuidado con cualquier problema regional). Vea las ediciones a continuación para la discusión de Int64.

De acuerdo con la documentación de MSDN en IsNumeric :

  • IsNumeric devuelve True si el tipo de datos de Expression es Boolean, Byte, Decimal, Double, Integer, Long, SByte, Short, Single, UInteger, ULong o UShort, o un Object que contiene uno de esos tipos numéricos. También devuelve True si Expression es un Char o String que se puede convertir con éxito en un número.

  • IsNumeric devuelve False si Expression es del tipo de datos Date o del tipo de datos Object y no contiene un tipo numérico. IsNumeric devuelve False si Expression es un Char o String que no se puede convertir a un número.

Como está obteniendo un desajuste de tipo, tal vez un doble está interfiriendo con la conversión. IsNumeric no garantiza que sea un Entero, solo que coincide con una de las posibilidades numéricas. Si el número es doble, tal vez la configuración regional (coma, período, etc.) está causando la excepción.

Puede intentar convertirlo a un doble y luego a un número entero.

'' Using a couple of steps Dim iValue As Integer Dim dValue As Double dValue = CDbl(SourceValue) iValue = CInt(iValue) '' Or in one step (might make debugging harder) iValue = CInt(CDbl(SourceValue))

EDITAR: después de su aclaración, parece que obtiene una conversión de desbordamiento. Primero intente usar Long y CLng () en lugar de CInt (). Todavía existe la posibilidad de que la entrada sea Int64, lo cual es más difícil con VB6.

He utilizado el siguiente código para los tipos LARGE_INTEGER e Integer8 (ambos Int64), pero puede que no funcione para su situación:

testValue = CCur((inputValue.HighPart * 2 ^ 32) + _ inputValue.LowPart) / CCur(-864000000000)

Este ejemplo fue de un ejemplo de vencimiento de contraseña de LDAP , pero como dije, puede funcionar o no en su escenario. Si no tiene el tipo LARGE_INTEGER, parece que:

Private Type LARGE_INTEGER LowPart As Long HighPart As Long End Type

Busque LARGE_INTEGER y VB6 para obtener más información.

EDITAR: para la depuración, puede ser útil evitar temporalmente el manejo de errores y luego volver a encenderlo después de pasar las líneas problemáticas:

If IsNumeric(strMaxAlternatives) And strMaxAlternatives <> "" Then On Error Resume Next iGlobalMaxAlternatives = CInt(strMaxAlternatives) If Err.Number <> 0 Then Debug.Print "Conversion Error: " & strMaxAlternatives & _ " - " & Err.Description EndIf On Error Goto YourPreviousErrorHandler End If


IsNumeric devolverá verdadero si puede convertir la cadena a un número. Incluso si hay caracteres no numéricos en la cadena. Siempre recorro la cadena un caracter a la vez y pruebo cada personaje. Si un personaje falla, entonces puedo devolver un error.


Sí, "3.41" sería numérico pero no un número entero.


Sí. Prueba esto:

If IsNumeric("65537") Then Dim i As Integer i = CInt("65537") ''throws an error on this line! End If

Este es un desbordamiento, pero creo que ilustra la falta de fiabilidad de IsNumeric () en general (especialmente para los ints - para los dobles es mucho más confiable).


Según la documentación de VB6, "IsNumeric devuelve True si el tipo de datos de Expression es Boolean, Byte, Decimal, Double, Integer, Long, SByte, Short, Single, UInteger, ULong o UShort, o un Objeto que contiene uno de esos tipos numéricos. También devuelve True si Expression es un Char o String que puede convertirse con éxito en un número ".

Muchos de ellos no se pueden convertir a un Entero. Por ejemplo, "1.5" es numérico, pero no es un número entero. Entonces, puedes convertirlo a un número, pero no necesariamente un número entero.


Su mejor opción es comenzar a registrar los errores con los valores reales con los que está trabajando para que pueda descubrir qué está pasando.


VB6 no proporciona buenos métodos para garantizar que CInt no falle. He encontrado que la forma más sencilla es usar solo el manejo de errores.

function TryParse(byval text as string, byref value as integer) as boolean on error resume next value = CInt(text) TryParse = (err.number = 0) endfunction

Por supuesto, sus preferencias de manejo de errores pueden variar.


Acabo de encontrar esta pepita. Si ejecuta lo siguiente, el script # 1 devuelve TRUE pero el script # 2 y # 3 fallará:

SELECT ISNUMERIC(''98,0'') AS isNum -- Fails SELECT CONVERT(INT, ''98,0'') -- Fails SELECT CONVERT(NUMERIC(11,4), ''98,0'') -- Fails