Próbuje usunąć wszystkie litery i znaki, które nie są cyframi 0–9 i kropką. Używam, Character.isDigit()ale usuwa dziesiętny, jak mogę zachować dziesiętny?
To dziwny sposób na powiedzenie tego. Czy „wszystkie litery i znaki, które nie są cyframi 0–9, a kropka” nie są odpowiednikami prostszych, „wszystkie znaki, które nie są cyframi 0–9, i kropka”? Mam na myśli, że litery to znaki, które nie są 0-9 ani kropką.
Może to również działać:> str = str.replaceAll ("[\\ D.]", "");
yeaaaahhhh..hamf hamf
1
@ Óscar López: jak również uwzględnić liczby ujemne? Mam na myśli, że muszę zastąpić wszystko, co nie jest liczbą dodatnią / ujemną, pustą spacją. Jak to zrobić?
Pankaj Singhal
3
@PankajSinghal po prostu umieść w wyrażeniu regularnym znak minus:[^\\d.-]
Óscar López
3
@ yeaaaahhhh..hamfhamf nie, to nie zadziała. Musimy zanegować całą grupę (w tym liczby i kropki), sugerowany kod neguje tylko liczby, a wynik nie będzie zawierał kropek, zgodnie z wymaganiami. Czy przetestować go? przy użyciu powyższego kodu przykładowego kod jest zwracany "1233478", co jest niepoprawne.
Óscar López
Działa bardzo dobrze, nawet w Androidzie. Dzięki.
juanram0n
98
Użyłbym wyrażenia regularnego.
String text ="-jaskdh2367sd.27askjdfh23";String digits = text.replaceAll("[^0-9.]","");System.out.println(digits);
Nie wiem, dlaczego ludzie ocenili twoje rozwiązanie ... Pomogło mi bardzo, dzięki! Głosy w górę!
Zarial
Dzięki Zarial, widzę, że Robert faktycznie zredagował moją odpowiedź z str = str.replaceAll („\ D +”, „”); to str = str.replaceAll („\\ D +”, „”); ... Więc popełniłem ten błąd, wklejając go do pola edytora StackO. Dziękuję Robertowi za naprawę. Teraz działa!
Angoranator777
jest to odrzucone, ponieważ jest to repost. Dokładna taka sama odpowiedź została już opublikowana 5 lat temu !! patrz wyżej: stackoverflow.com/a/10372905/704246
Saad Benbouzid
@SaadBenbouzid huh? jaka jest twoja definicja dokładnie tej samej odpowiedzi?
Boris Treukhov
2
@ SaadBenbouzid 1), który jest komentarzem, a nie odpowiedzią 2), który jest zupełnie innym wyrażeniem regularnym 3) nie wszystkie odpowiedzi, które używają wyrażenia regularnego D są identyczne, to jak wskazanie, że wszystkie odpowiedzi w języku C, które używają, printf()są duplikatami. Również jeśli zobaczysz odpowiedź w komentarzu, możesz poprosić mod, aby przekonwertował ją na odpowiedź, a nawet samodzielnie dodał odpowiedź - odpowiedzi w komentarzach są zniechęcone na StackOverlow.
Boris Treukhov
6
Prosty sposób bez użycia Regex:
Dodanie dodatkowego sprawdzania znaku dla kropki '.'rozwiąże wymóg:
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();}
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.}
Odpowiedzi:
Wypróbuj ten kod:
Teraz
str
będzie zawierać"12.334.78"
.źródło
[^\\d.-]
"1233478"
, co jest niepoprawne.Użyłbym wyrażenia regularnego.
odciski
Możesz także zatrzymać
-
dla liczb ujemnych.źródło
^
i co.
oznacza w tym stwierdzeniu?[^
nie oznacza tych znaków, a wewnątrz[]
a.
jest po prostu.
.
jest tylko aa
i nic nie znaczy, czy mogę się go po prostu pozbyć?.
wyników.wynik: 0097-557890-999
jeśli nie potrzebujesz również „-” w String, możesz to zrobić w następujący sposób:
wynik: 0097557890999
źródło
Z guawą:
patrz http://code.google.com/p/guava-libraries/wiki/StringsExplained
źródło
źródło
printf()
są duplikatami. Również jeśli zobaczysz odpowiedź w komentarzu, możesz poprosić mod, aby przekonwertował ją na odpowiedź, a nawet samodzielnie dodał odpowiedź - odpowiedzi w komentarzach są zniechęcone na StackOverlow.Prosty sposób bez użycia Regex:
Dodanie dodatkowego sprawdzania znaku dla kropki
'.'
rozwiąże wymóg:źródło
Sposób na zastąpienie go strumieniem Java 8:
źródło
Separator dziesiętny waluty może różnić się w zależności od ustawień regionalnych.
.
Zawsze uważanie za separator może być niebezpieczne . to znaczyMyślę, że właściwy sposób to:
DecimalFormatSymbols
pomocą domyślnego ustawienia regionalnego lub określonego.A oto jak to rozwiązuję:
import java.text.DecimalFormatSymbols;
import java.util.Locale;
kod:
Mam nadzieję, że to może pomóc ”.
źródło
Dla osób z Androidem przybywających tutaj po Kotlin
Wynik:
To może być następnie bezpiecznie przekształcone
toDouble()
,toFloat()
lubtoInt()
w razie potrzebyźródło
Obsługuje to zerowe dane wejściowe, liczby ujemne i dziesiętne (musisz dołączyć do projektu bibliotekę Apache Commons Lang, wersja 3.8 lub wyższa):
Odwołanie do biblioteki: https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/RegExUtils.html
źródło