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?


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".


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.


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


¡Gracias por la gran respuesta! R
shridutt kothari


19
str = str.replaceAll("\\D+","");

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();
}

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.
}

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 '.


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


O Number, en Java puro.
Alex Byrth

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.