Java String entfernt alle nicht numerischen Zeichen

237

Es wird versucht, alle Buchstaben und Zeichen zu entfernen, die nicht 0-9 und ein Punkt sind. Ich verwende, Character.isDigit()aber es entfernt auch Dezimalstellen. Wie kann ich auch die Dezimalstellen beibehalten?

DRing
quelle
4
[myStr = myStr.replaceAll ("[^ \\ d]", "")] [1] [1]: stackoverflow.com/questions/1533659/…
Bitmap
2
Dies ist eine seltsame Art, dies zu sagen. Entspricht nicht "alle Buchstaben und Zeichen, die nicht 0-9 und ein Punkt sind" dem einfacheren "alle Zeichen, die nicht 0-9 und ein Punkt sind"? Ich meine, Buchstaben sind Zeichen, die weder 0-9 noch die Periode sind.
Adam Zalcman

Antworten:

521

Versuchen Sie diesen Code:

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

Jetzt strwird enthalten "12.334.78".

Óscar López
quelle
18
Dies könnte auch funktionieren:> str = str.replaceAll ("[\\ D.]", "");
yeaaaahhhh..hamf hamf
1
@ Óscar López: Wie kann man auch negative Zahlen einbeziehen? Ich meine, ich muss alles, was keine positive / negative Zahl ist, durch ein leeres Leerzeichen ersetzen. Wie geht das?
Pankaj Singhal
3
@PankajSinghal fügen Sie einfach das Minuszeichen in die Regex ein:[^\\d.-]
Óscar López
3
@ yeaaaahhhh..hamfhamf nein, das wird nicht funktionieren. Wir müssen die gesamte Gruppe (einschließlich Zahlen und Punkte) negieren, Ihr vorgeschlagener Code negiert nur die Zahlen und das Ergebnis enthält nicht die erforderlichen Punkte. Hast du es getestet ? Wenn Sie den obigen Beispielcode verwenden, wird Ihr Code zurückgegeben "1233478", was falsch ist.
Óscar López
Funktioniert auch in Android sehr gut. Vielen Dank.
Juanram0n
98

Ich würde einen regulären Ausdruck verwenden.

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

druckt

2367.2723

Vielleicht möchten Sie -auch für negative Zahlen behalten .

Peter Lawrey
quelle
Sie sollten dem Punkt in Ihrem regulären Ausdruck nicht entkommen.
Adam Zalcman
Könnten Sie bitte erklären, was diese Aussage bedeutet ^und was sie .bedeutet?
Mansour Fahad
1
@ MansourFahad In einem regulären Ausdruck [^bedeutet nicht diese Zeichen und in einem []a .ist nur ein.
Peter Lawrey
1
Da a .nur a ist aund nichts bedeutet, kann ich es einfach loswerden?
Mansour Fahad
@ MansourFahad nur, wenn Sie kein .s in Ihrem Ergebnis wollen.
Methodensignatur
44
String phoneNumberstr = "Tel: 00971-557890-999";
String numberRefined = phoneNumberstr.replaceAll("[^\\d-]", "");

Ergebnis: 0097-557890-999

Wenn Sie in String auch kein "-" benötigen, können Sie Folgendes tun:

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

Ergebnis: 0097557890999

Faakhir
quelle
Vielen Dank für die tolle Antwort !! r
Shridutt Kothari
20

Mit Guave:

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

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

Kerem Baydoğan
quelle
1
Warum in aller Welt brauchst du Guave für eine so einfache und wesentliche Aufgabe?!
Egorikem
@egorikem Wenn Ihr Projekt bereits Guave verwendet, können Sie es ohne zusätzliche Kosten verwenden ..
Stan
19
str = str.replaceAll("\\D+","");
Angoranator777
quelle
Keine Ahnung, warum die Leute Ihre Lösung abgelehnt haben ... Hat mir sehr geholfen, danke! Stimmen ab!
Zarial
Danke Zarial, ich sehe, dass Robert meine Antwort von str = str.replaceAll ("\ D +", "") tatsächlich bearbeitet hat; zu str = str.replaceAll ("\\ D +", ""); ... Also habe ich diesen Fehler gemacht, als ich ihn in das Editor-Box-Ding von StackO eingefügt habe. Also danke Robert für die Reparatur. Jetzt gehts!
Angoranator777
Es ist herabgestuft, weil es ein Repost ist. Genau die gleiche Antwort wurde bereits vor 5 Jahren untervermietet !! siehe oben: stackoverflow.com/a/10372905/704246
Saad Benbouzid
@ SaadBenbouzid nicht wahr? Was ist Ihre Definition der exakt gleichen Antwort?
Boris Treukhov
2
@SaadBenbouzid 1) das ist ein Kommentar und keine Antwort 2) das ist ein völlig anderer regulärer Ausdruck 3) nicht alle Antworten, die regulären Ausdruck D verwenden, sind identisch, es ist wie darauf hinzuweisen, dass alle Antworten in der C-Sprache, die verwendet printf()werden, Duplikate sind. Auch wenn Sie eine Antwort im Kommentar sehen, können Sie mod bitten, sie in eine Antwort umzuwandeln oder sogar selbst eine Antwort hinzuzufügen - Antworten in Kommentaren werden in StackOverlow nicht empfohlen.
Boris Treukhov
6

Einfacher Weg ohne Regex:

Durch Hinzufügen einer zusätzlichen Zeichenprüfung für Punkte '.'wird die Anforderung gelöst:

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
quelle
3

Eine Möglichkeit, es durch einen Java 8-Stream zu ersetzen:

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
quelle
3

Das Dezimaltrennzeichen für Währungen kann von Gebietsschema zu Gebietsschema unterschiedlich sein. Es könnte gefährlich sein, .immer als Trennzeichen zu betrachten . dh

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

Ich denke, der richtige Weg ist:

  • Rufen Sie das Dezimalzeichen DecimalFormatSymbolsstandardmäßig über das Gebietsschema oder ein angegebenes ab.
  • Kochen Sie das Regex-Muster mit Dezimalzeichen, um nur Ziffern zu erhalten

Und hier, wie ich es löse:

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

Code:

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

Ich hoffe, das kann helfen. '

Maher Abuthraa
quelle
3

Für die Android-Leute, die wegen Kotlin hierher kommen

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

Ausgabe:

cleanString = "12345.67"

Dies könnte dann sicher konvertiert toDouble()werden toFloat()oder toInt()bei Bedarf

Michael
quelle
Oder Nummer in reinem Java.
Alex Byrth