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?

DRing
fuente
44
[myStr = myStr.replaceAll ("[^ \\ d]", "")] [1] [1]: stackoverflow.com/questions/1533659/…
Mapa de bits
2
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.
Adam Zalcman

Respuestas:

521

Prueba este código:

String str = "a12.334tyz.78x";
str = str.replaceAll("[^\\d.]", "");

Ahora strlo contendré "12.334.78".

Óscar López
fuente
18
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.

Peter Lawrey
fuente
No debes escapar del punto en tu expresión regular.
Adam Zalcman
¿Podría por favor dar alguna explicación de lo que significa ^y .significa en esta declaración?
Mansour Fahad
1
@MansourFahad En una expresión regular [^significa que no estos personajes y dentro de una []a .es solo una.
Peter Lawrey
1
Como a .es solo un ay no significa nada, ¿puedo deshacerme de él?
Mansour Fahad
@MansourFahad solo si no desea que haya ningún .resultado en su resultado.
methodignature
44
String phoneNumberstr = "Tel: 00971-557890-999";
String numberRefined = phoneNumberstr.replaceAll("[^\\d-]", "");

resultado: 0097-557890-999

si tampoco necesita "-" en String, puede hacer lo siguiente:

String phoneNumberstr = "Tel: 00971-55 7890 999";      
String numberRefined = phoneNumberstr.replaceAll("[^0-9]", "");

resultado: 0097557890999

Faakhir
fuente
¡Gracias por la gran respuesta! R
shridutt kothari
20

Con guayaba:

String input = "abx123.5";
String result = CharMatcher.inRange('0', '9').or(CharMatcher.is('.')).retainFrom(input);

ver http://code.google.com/p/guava-libraries/wiki/StringsExplained

Kerem Baydoğan
fuente
1
¿Por qué en el mundo necesitarías guayaba para una tarea tan fácil y esencial?
egorikem
@egorikem si su proyecto ya está usando guayaba, puede usarlo sin costo adicional ..
Stan
19
str = str.replaceAll("\\D+","");
Angoranator777
fuente
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:

public static String getOnlyNumerics(String str) {
    if (str == null) {
        return null;
    }
    StringBuffer strBuff = new StringBuffer();
    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();
}
shridutt kothari
fuente
3

Una forma de reemplazarlo con una transmisión de Java 8:

public static void main(String[] args) throws IOException
{
    String test = "ab19198zxncvl1308j10923.";
    StringBuilder result = new StringBuilder();

    test.chars().mapToObj( i-> (char)i ).filter( c -> Character.isDigit(c) || c == '.' ).forEach( c -> result.append(c) );

    System.out.println( result ); //returns 19198.130810923.
}
Orin
fuente
3

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 
 United Kingdom  £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

Y aquí cómo lo estoy resolviendo:

import java.text.DecimalFormatSymbols;
import java.util.Locale;

código:

    public static String getDigit(String quote, Locale locale) {
    char decimalSeparator;
    if (locale == null) {
        decimalSeparator = new DecimalFormatSymbols().getDecimalSeparator();
    } else {
        decimalSeparator = new DecimalFormatSymbols(locale).getDecimalSeparator();
    }

    String regex = "[^0-9" + decimalSeparator + "]";
    String valueOnlyDigit = quote.replaceAll(regex, "");
    try {
        return valueOnlyDigit;
    } catch (ArithmeticException | NumberFormatException e) {
        Log.e(TAG, "Error in getMoneyAsDecimal", e);
        return null;
    }
    return null;
}

Espero que eso pueda ayudar '.

Maher Abuthraa
fuente
3

Para la gente de Android que viene aquí por Kotlin

val dirtyString = "💰 Account Balance: $-12,345.67"
val cleanString = dirtyString.replace("[^\\d.]".toRegex(), "")

Salida:

cleanString = "12345.67"

Esto podría convertirse de forma segura toDouble(), toFloat()o toInt()si es necesario

Miguel
fuente
O Number, en Java puro.
Alex Byrth