2009-11-03 12 views
12

¿Hay una forma mejor de probar si una cadena se puede convertir en un número entero que no sea el siguiente?probando si una cadena se puede convertir como un entero en VB.NET

Public Function IsInt(ByVal value As Object) As Boolean 
    Try 
     Dim temp As Integer = CInt(value) 
     Return True 
    Catch ex As Exception 
     Return False 
    End Try 
End Function 

por "mejor" Me refiero a menos detallado y/o sin una excepción.

TryParse sería el camino a seguir, pero estoy usando el compact framework 2.0 y no parece TryParse a implementarse ....

Gracias de todos modos.

Parece que MarkJ es correcto y lo anterior parece ser funcionalmente el mismo que IsNumeric, así que supongo que esa es mi respuesta. No sé por qué pensé que CInt era más estricto que IsNumeric. Supongo que es mejor probar usando ICnt versos IsNumeric ya que esa es la función que estoy usando para hacer la conversión.

+3

+1 para evitar excepciones en el flujo normal de control. – Heinzi

+1

¿Qué, no hay sugerencias aquí para usar expresiones regulares? ¡Estoy sorprendido! (http://stackoverflow.com/questions/223832/check-a-string-to-see-if-all-characters-are-hexadecimal-values) –

+0

@Michael Burr: a petición suya, he agregado una sugerencia para usar expresiones regulares Como TryParse no es compatible, creo que la expresión regular es tu próxima mejor opción en este caso. –

Respuesta

13

Usted puede utilizar el construido en IsNumeric Función

Dim CanConvert as Boolean = IsNumeric(value) 

http://msdn.microsoft.com/en-us/library/6cd3f6w1(VS.71).aspx

+1

IsNumeric permite $ y. que puede causar que el lanzamiento falle. –

+0

En ese caso TryParse es el camino a seguir –

+1

+1 @Booji Boy, eres incorrecto. IsNumeric permite '.' y' $ 'pero también lo hace CInt (redondea los valores fraccionarios hacia abajo). Lo he comprobado con el framework de escritorio: ¿el framework Compact hace algo diferente? – MarkJ

3

bien si quiere evitar el uso de excepciones, puede compararlo con una expresión regular que permita solo caracteres de dígitos antes de la conversión.

+2

pero luego tendría dos problemas. ;-) –

4
Public Function IsInt(ByVal value As Object) As Boolean 
    Dim i As Integer 
    Return Integer.TryParse(Convert.ToString(value), i) 
End Function 
1
Dim s as String = "23" 
Dim i as Integer 
If Int32.TryParse(s, i) Then 
    ' String was a valid integer... ' 
End If 
5

puede utilizar Integer.TryParse, que devolverá un booleano que indica si la conversión fue exitosa o no

1

Utilice TryParse método compartido del tipo Entero.

Por ejemplo:

Private Function CanStringBeCastAsInteger(ByVal myString As String) As Boolean 
    Dim myInt As Integer = 0 
    Return Integer.TryParse(myString, myInt) 
End Function 

La ventaja de utilizar el método TryParse es que evita tener que tirar y posteriormente capturar una excepción cuando la conversión falla. Lanzar y atrapar excepciones es una operación costosa.

El método TryParse no solo arrojará un resultado verdadero/falso, indicando si la conversión tendrá éxito o no, también devolverá, en el parámetro myInt en mi ejemplo, la conversión resultante para usted, todo en una línea de código.

0

Necesitará lanzar su propia expresión regular e.x .: Regex.IsMatch ("4354354", "\ d +"), e incluir el bloque try/catch como una copia de seguridad.

+0

-1, lo siento, por un par de razones.Try/Catch es bueno como parte de la lógica de manejo de errores de la aplicación, pero no simplemente como copia de seguridad en caso de que la lógica regex lo omita. La expresión regular para esto no es tan difícil que no se pueda garantizar su corrección. También tiene que rechazarlo porque la expresión regular en su ejemplo no es adecuada. "A123Z" pasaría, y "-10" fallaría. –

2

Si solo realiza la conversión con poca frecuencia, lo que tiene está bien (suponiendo que no haya TryParse() disponible); no afectará el rendimiento.

Si va a realizar millones de conversiones, y una gran cantidad de ellas podría fallar, la excepción que está atrapando podría ser un problema de rendimiento (tal vez).

Si no puede usar TryParse() probablemente lo mejor que se puede hacer (perf-wise) es simplemente verificar cada carácter en la cadena y si no es un dígito, devolver falso. No olvide contar con un posible signo negativo y separadores de grupo (si desea respaldarlos).

De lo contrario, analice la cadena a un int, que tendrá éxito en el 99% de los casos. solo recibirá una excepción si no se ajusta.Si realmente desea evitar la excepción que puede generar Parse(), no es difícil analizar realmente el valor de los dígitos y devolver el error si se sale de rango.

Jon Skeet hizo un análisis rápido de esta vuelta antes de que el marco contenido TryParse():

Nada de esto fija el nivel de detalle, sin embargo. pero siempre que sea un método autónomo, no hay un problema real con un poco de verbosidad.

1

Aquí es algo muy similar a lo que ya tiene, pero utiliza la clase Convertir en lugar de CType y no utiliza TryParse

Public Function IsInt(ByVal value As Object) As Boolean 
    Try 
     Convert.ToInt32(value) 
     Return True 
    Catch ex As System.FormatException 
     Return False 
    End Try 
End Function 
+0

¿Por qué usar la clase 'Convert'? No hay ventaja para eso. De hecho, la clase 'Convert' es bastante superflua (excepto cuando necesitas representar un número en una base distinta de 10, y 16 que son las únicas bases soportadas por' ToString'). –

6

Desde TryParse isn't supported en el Compact Framework, expresiones regulares es su mejor opción.

El primer ejemplo no permite decimales. El segundo lo hace

Regex.IsMatch(value, "^-?\d+$") 
Regex.IsMatch(value, "^-?\d+(?:\.\d+)?$") 

Si necesita permitir la notación científica, debe modificarla un poco más. Realmente no es tan malo. Tiene el comienzo de la cadena ^, un guión opcional -?, uno o más dígitos \d+, un grupo no captivo (?:) que busca un solo punto decimal \. y uno o más dígitos \d+. Otro ? para permitir cero o una instancia del grupo que no captura, y luego el final de la cadena $.

Editar: Una cosa que no me pienso antes: este método es un poco impreciso, ya que podría obtener un número muy grande que es numéricamente un entero válido, pero no se puede convertir en un Int32. Si eso es una posibilidad, puede restringir el número de caracteres. En lugar de \d+, puede hacer \d{1,8}, por ejemplo.

+0

+1 para otro Compact Framework gotcha –

+2

El método tampoco tiene en cuenta la región: algunas culturas usan la coma ',' para el delimitador decimal no punto '.' – MarkJ

+0

@MarkJ, buen punto. –

-1

hacer como siguen

If myString <> "" And IsNumeric(myString) = True Then 

     If CDbl(myString) - Int(CDbl(myString)) > 0 Then 
      .... myString is integer 
     End If 

    End If 
Cuestiones relacionadas