Normalmente uso el siguiente idioma para verificar si una cadena se puede convertir en un entero.
public boolean isInteger( String input ) {
try {
Integer.parseInt( input );
return true;
}
catch( Exception e ) {
return false;
}
}
¿Soy solo yo, o esto parece un poco duro? ¿Qué es una mejor manera?
Vea mi respuesta (con puntos de referencia, basada en la respuesta anterior de CodingWithSpike ) para ver por qué he revertido mi posición y acepté la respuesta de Jonas Klemming a este problema. Creo que este código original será utilizado por la mayoría de las personas porque es más rápido de implementar y más fácil de mantener, pero es mucho más lento cuando se proporcionan datos no enteros.
Respuestas:
Si no le preocupan los posibles problemas de desbordamiento, esta función funcionará entre 20 y 30 veces más rápido que el uso
Integer.parseInt()
.fuente
Lo tienes, pero solo debes atraparlo
NumberFormatException
.fuente
Hice un punto de referencia rápido. Las excepciones no son realmente tan costosas, a menos que comience a recuperar múltiples métodos y la JVM tenga que hacer mucho trabajo para que la pila de ejecución esté en su lugar. Cuando se quedan en el mismo método, no son malos.
Salida:
Estoy de acuerdo en que la solución de Jonas K es la más sólida también. Parece que gana :)
fuente
^
y$
por segunda vez, ya que enmatches
toda la cadena debe coincidir con expresiones regulares, (2)str.matches
cada vez que tendrá que crear su propioPattern
, que es caro. Por razones de rendimiento, deberíamos crear dicho patrón solo una vez fuera de este método y usarlo dentro. (3) También podemos crear un solo objeto Matcher y usarloreset(CharSequence)
para pasar datos de usuario y devolver sumatches()
resultado.private final Matcher m = Pattern.compile("-?\\d+").matcher(""); private boolean byRegex(String str) { return m.reset(str).matches(); }
debería tener un mejor rendimiento.matches
está agregando^
e$
implícitamente. Echa un vistazo al resultado de" 123".matches("\\d+")
y"123".matches("\\d+")
. Verásfalse
ytrue
.false
se devolverá porque la cadena comienza con un espacio que evita que sea regex.Dado que existe la posibilidad de que la gente todavía visite aquí y se predisponga contra Regex después de los puntos de referencia ... Así que voy a dar una versión actualizada del punto de referencia, con una versión compilada de Regex. En oposición a los puntos de referencia anteriores, este muestra que la solución Regex en realidad tiene un rendimiento consistentemente bueno.
Copiado de Bill the Lizard y actualizado con la versión compilada:
Resultados:
fuente
336
."^[+-]?\\d+$"
sería aún mejor.aunque la biblioteca estándar de Java realmente pierde esas funciones de utilidad
Creo que Apache Commons es un "must have" para cada programador de Java
lástima que aún no se ha portado a Java5
fuente
Depende en parte de lo que quiere decir con "puede convertirse en un entero".
Si quiere decir "puede convertirse en un int en Java", la respuesta de Jonas es un buen comienzo, pero no termina el trabajo. Pasaría 999999999999999999999999999999 por ejemplo. Añadiría la llamada normal try / catch de su propia pregunta al final del método.
Las comprobaciones de carácter por carácter rechazarán eficientemente los casos "no un número entero en absoluto", dejando los casos "es un número entero pero Java no puede manejarlo" para ser detectados por la ruta de excepción más lenta. También podrías hacer esto a mano, pero sería mucho más complicado.
fuente
Solo un comentario sobre regexp. ¡Cada ejemplo provisto aquí es incorrecto! Si quieres usar regexp, no olvides que compilar el patrón lleva mucho tiempo. Esta:
y también esto:
provoca la compilación del patrón en cada llamada al método. Para usarlo correctamente siga:
fuente
Hay versión de guayaba:
Volverá nulo en lugar de lanzar una excepción si no puede analizar la cadena.
fuente
Copié el código de la respuesta rally25rs y agregué algunas pruebas para datos no enteros. Los resultados son indudablemente a favor del método publicado por Jonas Klemming. Los resultados para el método de excepción que publiqué originalmente son bastante buenos cuando tienes datos enteros, pero son los peores cuando no los tienes, mientras que los resultados para la solución RegEx (que apuesto a que mucha gente usa) fueron consistentemente malos. Vea la respuesta de Felipe para un ejemplo de expresiones regulares compiladas, que es mucho más rápido.
Resultados:
fuente
Esto es más corto, pero más corto no es necesariamente mejor (y no capturará valores enteros que estén fuera de rango, como se señala en el comentario de danatel ):
Personalmente, dado que la implementación se elimina en un método auxiliar y la corrección triunfa sobre la longitud, simplemente iría con algo como lo que tienes (menos la captura de la
Exception
clase base en lugar deNumberFormatException
).fuente
Puede usar el método de coincidencias de la clase de cadena. El [0-9] representa todos los valores que puede ser, el + significa que debe tener al menos un carácter y el * significa que puede tener cero o más caracteres.
fuente
Qué tal si:
fuente
Esta es una variación de Java 8 de la respuesta de Jonas Klemming:
Código de prueba:
Resultados del código de prueba:
fuente
Simplemente marque NumberFormatException : -
fuente
Si su matriz de cadenas contiene enteros y cadenas puros, el siguiente código debería funcionar. Solo tienes que mirar al primer personaje. por ejemplo, ["4", "44", "abc", "77", "enlace"]
fuente
También puede usar la clase Scanner y usar hasNextInt () , y esto también le permite probar otros tipos, como flotadores, etc.
fuente
Si desea verificar si la cadena representa un número entero que cabe en un tipo int, hice una pequeña modificación a la respuesta de jonas, para que las cadenas que representan números enteros más grandes que Integer.MAX_VALUE o más pequeños que Integer.MIN_VALUE, ahora regresen falso. Por ejemplo: "3147483647" devolverá falso porque 3147483647 es mayor que 2147483647, y del mismo modo, "-2147483649" también devolverá falso porque -2147483649 es menor que -2147483648.
fuente
trim()
lo que es claramente una elección de diseño intencional.Puedes probar apache utils
Mira el javadoc aquí
fuente
isCreateable(String)
en su lugar.Probablemente también deba tener en cuenta el caso de uso:
Si la mayoría de las veces espera que los números sean válidos, la captura de la excepción solo está causando una sobrecarga en el rendimiento al intentar convertir números no válidos. Mientras que llamar a algún
isInteger()
método y luego convertir usandoInteger.parseInt()
serán siempre causa una sobrecarga en el rendimiento para los números válidos - las cadenas se analizan dos veces, una vez por el cheque y una vez por la conversión.fuente
Esta es una modificación del código de Jonas que comprueba si la cadena está dentro del rango para convertirse en un entero.
fuente
Si está utilizando la API de Android, puede usar:
fuente
Otra opción:
fuente
fuente
Lo que hiciste funciona, pero probablemente no siempre deberías comprobarlo de esa manera. Las excepciones de lanzamiento deben reservarse para situaciones "excepcionales" (aunque tal vez eso se ajuste a su caso) y son muy costosas en términos de rendimiento.
fuente
fuente
Esto funcionaría solo para enteros positivos.
fuente
Esto funciona para mi. Simplemente para identificar si una Cadena es primitiva o un número.
fuente
Para verificar todos los caracteres int, simplemente puede usar un doble negativo.
if (! searchString.matches ("[^ 0-9] + $")) ...
[^ 0-9] + $ comprueba si hay caracteres que no son enteros, por lo que la prueba falla si es verdad. Simplemente NO eso y te vuelves verdadero en el éxito.
fuente
matches
método coincide con toda la cadena, no solo una parte de ella.if
bloque. No deberíaEncontrar esto puede ser útil:
fuente
Creo que no hay riesgo de encontrarse con una excepción, porque como puede ver a continuación, siempre analiza
int
con seguridadString
y no al revés.Entonces:
Usted comprueba si cada ranura de carácter en sus partidos de cuerda, al menos, uno de los personajes { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"} .
Usted resumir todas las veces que usted encontró en las ranuras de los personajes anteriores.
Y finalmente verifica si las veces que encontró enteros como caracteres es igual a la longitud de la cadena dada.
Y en la práctica tenemos:
Y los resultados son:
Del mismo modo, puede validar si a
String
es afloat
o a,double
pero en esos casos solo tiene que encontrar uno. (punto) en la Cadena y, por supuesto, compruebe sidigits == (aString.length()-1)
Espero haber ayudado
fuente