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?
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.
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 .
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:
publicstaticString getOnlyNumerics(String str){if(str ==null){returnnull;}StringBuffer strBuff =newStringBuffer();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();}
Eine Möglichkeit, es durch einen Java 8-Stream zu ersetzen:
publicstaticvoid main(String[] args)throwsIOException{String test ="ab19198zxncvl1308j10923.";StringBuilder result =newStringBuilder();
test.chars().mapToObj( i->(char)i ).filter( c ->Character.isDigit(c)|| c =='.').forEach( c -> result.append(c));System.out.println( result );//returns 19198.130810923.}
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 ║║UnitedKingdom║£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
Dies behandelt Null-Eingaben, negative Zahlen und Dezimalstellen (Sie müssen die Apache Commons Lang-Bibliothek, Version 3.8 oder höher, in Ihr Projekt aufnehmen):
import org.apache.commons.lang3.RegExUtils;
result =RegExUtils.removeAll(input,"-?[^\\d.]");
Antworten:
Versuchen Sie diesen Code:
Jetzt
str
wird enthalten"12.334.78"
.quelle
[^\\d.-]
"1233478"
, was falsch ist.Ich würde einen regulären Ausdruck verwenden.
druckt
Vielleicht möchten Sie
-
auch für negative Zahlen behalten .quelle
^
und was sie.
bedeutet?[^
bedeutet nicht diese Zeichen und in einem[]
a.
ist nur ein.
.
nur a ista
und nichts bedeutet, kann ich es einfach loswerden?.
s in Ihrem Ergebnis wollen.Ergebnis: 0097-557890-999
Wenn Sie in String auch kein "-" benötigen, können Sie Folgendes tun:
Ergebnis: 0097557890999
quelle
Mit Guave:
Siehe http://code.google.com/p/guava-libraries/wiki/StringsExplained
quelle
quelle
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.Einfacher Weg ohne Regex:
Durch Hinzufügen einer zusätzlichen Zeichenprüfung für Punkte
'.'
wird die Anforderung gelöst:quelle
Eine Möglichkeit, es durch einen Java 8-Stream zu ersetzen:
quelle
Das Dezimaltrennzeichen für Währungen kann von Gebietsschema zu Gebietsschema unterschiedlich sein. Es könnte gefährlich sein,
.
immer als Trennzeichen zu betrachten . dhIch denke, der richtige Weg ist:
DecimalFormatSymbols
standardmäßig über das Gebietsschema oder ein angegebenes ab.Und hier, wie ich es löse:
import java.text.DecimalFormatSymbols;
import java.util.Locale;
Code:
Ich hoffe, das kann helfen. '
quelle
Für die Android-Leute, die wegen Kotlin hierher kommen
Ausgabe:
Dies könnte dann sicher konvertiert
toDouble()
werdentoFloat()
odertoInt()
bei Bedarfquelle
Dies behandelt Null-Eingaben, negative Zahlen und Dezimalstellen (Sie müssen die Apache Commons Lang-Bibliothek, Version 3.8 oder höher, in Ihr Projekt aufnehmen):
Bibliotheksreferenz: https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/RegExUtils.html
quelle