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?


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


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 .


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


Vielen Dank für die tolle Antwort !! r
Shridutt Kothari


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

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

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

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


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


Oder Nummer in reinem Java.
Alex Byrth

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.