Tengo una cadena que cargo en toda mi aplicación, y cambia de números a letras y demás. Tengo una if
declaración simple para ver si contiene letras o números, pero algo no funciona correctamente. Aquí hay un fragmento.
String text = "abc";
String number;
if (text.contains("[a-zA-Z]+") == false && text.length() > 2) {
number = text;
}
Aunque la text
variable contiene letras, la condición regresa como true
. El y &&
debe evaluar ya que ambas condiciones tienen que estar true
para procesar elnumber = text;
==============================
Solución:
Pude resolver esto usando el siguiente código provisto por un comentario sobre esta pregunta. ¡Todas las demás publicaciones son válidas también!
Lo que usé que funcionó vino del primer comentario. ¡Aunque todos los códigos de ejemplo proporcionados también parecen ser válidos!
String text = "abc";
String number;
if (Pattern.matches("[a-zA-Z]+", text) == false && text.length() > 2) {
number = text;
}
java
string
if-statement
RedHatcc
fuente
fuente
matches("\\d{2,}")
o intente con unaPattern
yMatcher
Pattern.matches("[a-zA-Z]+", text) == false
se puede simplificar a!Pattern.matches("[a-zA-Z]+", text)
boolean isNumeric = someString.chars().allMatch(x -> Character.isDigit(x));
formulario de API de transmisión JavaMax Malysh
.Respuestas:
Si procesará el número como texto, cambie:
a:
En lugar de verificar que la cadena no contenga caracteres alfabéticos, asegúrese de que solo contenga números.
Si realmente desea usar el valor numérico, use
Integer.parseInt()
oDouble.parseDouble()
como otros han explicado a continuación.Como nota al margen, generalmente se considera una mala práctica comparar valores booleanos con
true
ofalse
. Solo usaif (condition)
oif (!condition)
.fuente
^[0-9]+$
), de lo contrarioabc123def
se considerará un número.matches()
devuelve verdadero si y solo si es una coincidencia completa de principio a fin.&& (text.length() > 2)
. Todo se puede verificar en el patrón regex:if (text.matches("[0-9]{3,}")
También puede usar NumberUtil.isCreatable (String str) de Apache Commons
fuente
NumberUtil.isCreatable(String str)
sea correcto usarlo para lo que pide la pregunta original. Por ejemplo,NumberUtil.isCreatable( "09" )
retornosfalse
, aunque"09"
solo contenga números .Así es como lo haría:
El
$
evitará una coincidencia parcial, por ejemplo;1B
.fuente
text.length() > 2
parte, por lo que sólo sustituye^[0-9]*$
por^[0-9]+$
estar seguro de que tengo al menos un número.En cuanto al rendimiento
parseInt
, son mucho peores que otras soluciones, porque al menos requieren un manejo de excepciones.He ejecutado pruebas jmh y he descubierto que iterar sobre String usando
charAt
y comparando caracteres con caracteres de límite es la forma más rápida de probar si la cadena contiene solo dígitos.Prueba de JMH
Las pruebas comparan el rendimiento de
Character.isDigit
vsPattern.matcher().matches
vsLong.parseLong
vs comprobación de valores de caracteres.Estas formas pueden producir resultados diferentes para cadenas no ascii y cadenas que contienen signos +/-.
Las pruebas se ejecutan en modo de rendimiento ( mayor es mejor ) con 5 iteraciones de calentamiento y 5 iteraciones de prueba.
Resultados
Tenga en cuenta que
parseLong
es casi 100 veces más lento queisDigit
para la primera carga de prueba.Banco de pruebas
Actualizado el 23 de febrero de 2018
charAt
lugar de crear una matriz adicional y otro usandoIntStream
códigos charActualizado el 23 de febrero de 2018
fuente
Para verificar simplemente la cadena que contiene solo ALPHABETS, use el siguiente código:
Para verificar simplemente la cadena que contiene solo NUMBER use el siguiente código:
Espero que esto ayude a alguien!
fuente
boolean isNum = text.chars (). allMatch (c -> c> = 48 && c <= 57)
fuente
boolean isNum = text.chars().allMatch(c -> c >= '0' && c <= '9')
Puedes usar Regex.Match
O puede usar versiones similares
Integer.parseInt(String)
o mejoresLong.parseLong(String)
para números más grandes como, por ejemplo:Y luego prueba con:
fuente
Las expresiones regulares a continuación se pueden usar para verificar si una cadena tiene solo un número o no:
if (str.matches(".*[^0-9].*")) or if (str.matches(".*\\D.*"))
Ambas condiciones anteriores se devolverán
true
si String no contiene números. Encendidofalse
, la cadena solo tiene números.fuente
Apache Commons Lang proporciona
org.apache.commons.lang.StringUtils.isNumeric(CharSequence cs)
, que toma como argumentoString
ay comprueba si consta de caracteres puramente numéricos (incluidos números de scripts no latinos). Ese método devuelvefalse
si hay caracteres como espacio, menos, más y separadores decimales como coma y punto.Otros métodos de esa clase permiten más controles numéricos.
fuente
public static boolean isNumeric(String str) { if (str == null) { return false; } else { int sz = str.length(); for(int i = 0; i < sz; ++i) { if (!Character.isDigit(str.charAt(i))) { return false; } } return true; } }
Hay muchas facilidades para obtener números de
String
s en Java (y viceversa). Es posible que desee omitir la parte de expresiones regulares para evitar la complicación de eso.Por ejemplo, podría intentar ver qué le
Double.parseDouble(String s)
devuelve. Debería arrojar unNumberFormatException
si no encuentra un valor apropiado en la cadena. Sugeriría esta técnica porque en realidad podría hacer uso del valor representado por elString
como un tipo numérico.fuente
Aquí está mi código, ¡espero que esto te ayude!
fuente
Este código ya está escrito. Si no le importa el impacto de rendimiento (extremadamente) menor, que probablemente no sea peor que hacer una coincidencia de expresiones regulares, use Integer.parseInt () o Double.parseDouble () . Eso le dirá de inmediato si una cadena es solo números (o es un número, según corresponda). Si necesita manejar cadenas de números más largas, constructores deportivos BigInteger y BigDecimal que aceptan cadenas. Cualquiera de estos arrojará una NumberFormatException si intenta pasar un no número (integral o decimal, basado en el que elija, por supuesto). Alternativamente, dependiendo de sus requisitos, solo itere los caracteres en la Cadena y marque Character.isDigit ()y / o Character.isLetter () .
fuente
fuente
fuente
Ejemplo de prueba de trabajo
Aún así, su código se puede dividir en "1a", etc.
Método para verificar que no es cadena o no
fuente
Es una mala práctica involucrar cualquier lanzamiento / manejo de excepción en un escenario tan típico.
Por lo tanto un parseInt () no es agradable, pero una expresión regular es una solución elegante para esto, pero tenga cuidado de lo siguiente:
-fractions
números negativos al
separador -decimal podría diferir en Contries ( '' ejemplo '', o)
-a veces se le permite tener un llamado separador de miles, como un espacio o una coma, por ejemplo, 12,324,1000.355
Para manejar todos los casos necesarios en su aplicación, debe tener cuidado, pero esta expresión regular cubre los escenarios típicos (positivo / negativo y fraccionario, separados por un punto): ^ [- +]? \ D *.? \ D + $
For prueba, recomiendo regexr.com .
fuente
Versión ligeramente modificada de Adam Bodrogi:
Tuve que usar esto hoy, así que acabo de publicar mis modificaciones. Incluye moneda, miles de notación de coma o punto, y algunas validaciones. No incluye otras anotaciones de moneda (euro, centavo), las comas de verificación son cada tercer dígito.
fuente