Java String rimuove tutti i caratteri non numerici


237

Prova di rimuovere tutte le lettere e i caratteri che non sono 0-9 e un punto. Sto usando Character.isDigit()ma rimuove anche i decimali, come posso mantenere anche i decimali?


4
[myStr = myStr.replaceAll ("[^ \\ d]", "")] [1] [1]: stackoverflow.com/questions/1533659/…
Bitmap

2
Questo è uno strano modo di dirlo. "Tutte le lettere e i caratteri che non sono 0-9 e un punto" non sono equivalenti a più semplici "tutti i caratteri che non sono 0-9 e un punto"? Voglio dire, le lettere sono caratteri che non sono 0-9 né il punto.
Adam Zalcman,

Risposte:


521

Prova questo codice:

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

Ora strconterrà "12.334.78".


18
Potrebbe funzionare anche:> str = str.replaceAll ("[\\ D.]", "");
yeaaaahhhh..hamf hamf

1
@ Óscar López: come includere anche i numeri negativi? Voglio dire, devo sostituire tutto ciò che non è un numero positivo / negativo con uno spazio vuoto. Come farlo?
Pankaj Singhal,

3
@PankajSinghal include semplicemente il segno meno nella regex:[^\\d.-]
Óscar López

3
@ yeaaaahhhh..hamfhamf no, non funzionerà. Dobbiamo annullare l'intero gruppo (compresi numeri e punti), il codice suggerito nega solo i numeri e il risultato non includerà i punti, come richiesto. L'hai provato ? utilizzando il codice di esempio sopra riportato, il codice restituito "1233478"non è corretto.
Óscar López,

Funziona molto bene anche su Android. Grazie.
juanram0n,

98

Vorrei usare una regex.

String text = "-jaskdh2367sd.27askjdfh23";
String digits = text.replaceAll("[^0-9.]", "");
System.out.println(digits);

stampe

2367.2723

Potresti voler conservare -anche per i numeri negativi.


Non dovresti sfuggire al punto nella tua regexp.
Adam Zalcman,

Potresti per favore dare qualche spiegazione per cosa significa ^e cosa .significa in questa affermazione?
Mansour Fahad,

1
@MansourFahad In una regex [^significa non questi personaggi e all'interno di una []a .è solo un.
Peter Lawrey

1
Dato che a .è solo a ae non significa nulla, posso semplicemente liberarmene?
Mansour Fahad,

@MansourFahad solo se non vuoi .risultati nel tuo risultato.
methodignature

44
String phoneNumberstr = "Tel: 00971-557890-999";
String numberRefined = phoneNumberstr.replaceAll("[^\\d-]", "");

risultato: 0097-557890-999

se anche tu non hai bisogno di "-" in String puoi fare così:

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

risultato: 0097557890999


Grazie per la grande risposta !! r
shridutt kothari,


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

Non so perché le persone hanno votato in negativo la tua soluzione ... Mi ha aiutato molto, grazie! Vota!
Zarial,

Grazie Zarial, vedo che Robert ha effettivamente modificato la mia risposta da str = str.replaceAll ("\ D +", ""); a str = str.replaceAll ("\\ D +", ""); ... Quindi ho fatto questo errore incollandolo nella scatola dell'editor di StackO. Quindi grazie Robert per aver risolto. Ora funziona!
Angoranator777,

è sottovalutato perché è un repost. La stessa risposta esatta è già stata inviata 5 anni fa !! vedi sopra: stackoverflow.com/a/10372905/704246
Saad Benbouzid

@SaadBenbouzid eh? qual è la tua definizione della stessa risposta esatta?
Boris Treukhov,

2
@SaadBenbouzid 1) che è un commento e non una risposta 2) che è una regex completamente diversa 3) non tutte le risposte che usano regex D sono identiche, è come indicare che tutte le risposte in linguaggio C che usano printf()sono duplicate. Inoltre, se vedi una risposta nei commenti, puoi chiedere a mod di convertirla in una risposta o persino aggiungere una risposta da solo - le risposte nei commenti sono scoraggiate su StackOverlow.
Boris Treukhov,

6

Modo semplice senza usare Regex:

L'aggiunta di un controllo carattere aggiuntivo per punto '.'risolverà il 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

Un modo per sostituirlo con un flusso 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

Il separatore decimale della valuta può essere diverso da Locale a un altro. Potrebbe essere pericoloso considerare .sempre come separatore. vale a dire

╔════════════════╦═══════════════════╗
    Currency          Sample       
╠════════════════╬═══════════════════╣
 USA             $1,222,333.44 USD 
 United Kingdom  £1.222.333,44 GBP 
 European        1.333.333,44 EUR 
╚════════════════╩═══════════════════╝

Penso che il modo corretto sia:

  • Ottieni il carattere decimale tramite DecimalFormatSymbolsImpostazioni internazionali predefinite o specificato.
  • Cuocere il modello regex con il carattere decimale per ottenere solo cifre

Ed ecco come lo sto risolvendo:

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

codice:

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

Spero che possa essere d'aiuto '.


3

Per la gente di Android che viene qui per Kotlin

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

Produzione:

cleanString = "12345.67"

Questo potrebbe quindi essere convertito in modo sicuro toDouble(), toFloat()o toInt()se necessario


O numero, in puro Java.
Alex Byrth,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.