Java String elimina todos los caracteres no numéricos
237
Intentando eliminar todas las letras y caracteres que no son 0-9 y un punto. Estoy usando Character.isDigit()pero también elimina el decimal, ¿cómo puedo mantener el decimal?
Esta es una forma extraña de decir esto. ¿No son "todas las letras y caracteres que no son 0-9 y un punto" equivalente a más simple "todos los caracteres que no son 0-9 y un punto"? Quiero decir, las letras son caracteres que no son 0-9 ni el punto.
Esto también podría funcionar:> str = str.replaceAll ("[\\ D.]", "");
síaaahhhh..hamf hamf
1
@ Óscar López: ¿cómo incluir números negativos también? Quiero decir, tengo que reemplazar todo lo que no sea un número positivo / negativo con un espacio vacío. ¿Como hacer eso?
Pankaj Singhal
3
@PankajSinghal simplemente incluye el signo menos en la expresión regular:[^\\d.-]
Óscar López
3
@ yeaaaahhhh..hamfhamf no, eso no funcionará. Tenemos que negar todo el grupo (incluidos números y puntos), su código sugerido solo niega los números, y el resultado no incluirá puntos, según sea necesario. ¿Lo probaste ? usando el código de muestra anterior, su código regresa "1233478", lo cual es incorrecto.
Óscar López
Funciona muy bien incluso en Android. Gracias.
juanram0n
98
Yo usaría una expresión regular.
String text ="-jaskdh2367sd.27askjdfh23";String digits = text.replaceAll("[^0-9.]","");System.out.println(digits);
huellas dactilares
2367.2723
Es posible que desee mantener -también para los números negativos.
No sé por qué la gente rechazó su solución ... Me ayudó mucho, ¡gracias! ¡Votos arriba!
Zarial
Gracias Zarial, veo que Robert editó mi respuesta desde str = str.replaceAll ("\ D +", ""); a str = str.replaceAll ("\\ D +", ""); ... Así que cometí este error al pegarlo en la caja del editor de StackO. Así que gracias Robert por arreglarlo. ¡Ahora funciona!
Angoranator777
es rechazado porque es un reenvío. ¡La misma respuesta exacta ya ha sido sublucida hace 5 años! ver arriba: stackoverflow.com/a/10372905/704246
Saad Benbouzid el
@SaadBenbouzid ¿eh? ¿Cuál es su definición de la misma respuesta exacta?
Boris Treukhov
2
@SaadBenbouzid 1) es un comentario y no una respuesta 2) es una expresión regular completamente diferente 3) no todas las respuestas que usan expresiones regulares D son idénticas, es como señalar que todas las respuestas en lenguaje C que usan printf()son duplicadas. Además, si ve una respuesta en el comentario, puede pedirle a mod que la convierta en una respuesta o incluso agregar una respuesta por su cuenta; las respuestas en los comentarios no se recomiendan en StackOverlow.
Boris Treukhov
6
Manera simple sin usar Regex:
Agregar una verificación de caracteres adicional para punto '.'resolverá el requisito:
publicstaticString getOnlyNumerics(String str){if(str ==null){returnnull;}StringBuffer strBuff =newStringBuffer();char c;for(int i =0; i < str.length(); i++){
c = str.charAt(i);if(Character.isDigit(c)|| c =='.'){
strBuff.append(c);}}return strBuff.toString();}
Una forma de reemplazarlo con una transmisión de Java 8:
publicstaticvoid main(String[] args)throwsIOException{String test ="ab19198zxncvl1308j10923.";StringBuilder result =newStringBuilder();
test.chars().mapToObj( i->(char)i ).filter( c ->Character.isDigit(c)|| c =='.').forEach( c -> result.append(c));System.out.println( result );//returns 19198.130810923.}
El separador decimal de moneda puede ser diferente de la configuración regional a otra. Podría ser peligroso considerar .como separador siempre. es decir
╔════════════════╦═══════════════════╗║Currency║Sample║╠════════════════╬═══════════════════╣║ USA ║ $1,222,333.44 USD ║║UnitedKingdom║£1.222.333,44 GBP ║║European║€1.333.333,44 EUR ║╚════════════════╩═══════════════════╝
Creo que la forma correcta es:
Obtenga el carácter decimal a través DecimalFormatSymbolsde la configuración regional predeterminada o una especificada.
Cocine el patrón de expresiones regulares con caracteres decimales para obtener solo dígitos
Respuestas:
Prueba este código:
Ahora
str
lo contendré"12.334.78"
.fuente
[^\\d.-]
"1233478"
, lo cual es incorrecto.Yo usaría una expresión regular.
huellas dactilares
Es posible que desee mantener
-
también para los números negativos.fuente
^
y.
significa en esta declaración?[^
significa que no estos personajes y dentro de una[]
a.
es solo una.
.
es solo una
y no significa nada, ¿puedo deshacerme de él?.
resultado en su resultado.resultado: 0097-557890-999
si tampoco necesita "-" en String, puede hacer lo siguiente:
resultado: 0097557890999
fuente
Con guayaba:
ver http://code.google.com/p/guava-libraries/wiki/StringsExplained
fuente
fuente
printf()
son duplicadas. Además, si ve una respuesta en el comentario, puede pedirle a mod que la convierta en una respuesta o incluso agregar una respuesta por su cuenta; las respuestas en los comentarios no se recomiendan en StackOverlow.Manera simple sin usar Regex:
Agregar una verificación de caracteres adicional para punto
'.'
resolverá el requisito:fuente
Una forma de reemplazarlo con una transmisión de Java 8:
fuente
El separador decimal de moneda puede ser diferente de la configuración regional a otra. Podría ser peligroso considerar
.
como separador siempre. es decirCreo que la forma correcta es:
DecimalFormatSymbols
de la configuración regional predeterminada o una especificada.Y aquí cómo lo estoy resolviendo:
import java.text.DecimalFormatSymbols;
import java.util.Locale;
código:
Espero que eso pueda ayudar '.
fuente
Para la gente de Android que viene aquí por Kotlin
Salida:
Esto podría convertirse de forma segura
toDouble()
,toFloat()
otoInt()
si es necesariofuente
Esto maneja entradas nulas, números negativos y decimales (debe incluir la biblioteca Lang de Apache Commons, versión 3.8 o superior, en su proyecto):
Referencia de la biblioteca: https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/RegExUtils.html
fuente