Ciąg Java usuwa wszystkie znaki nienumeryczne

237

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?

DRING
źródło
4
[myStr = myStr.replaceAll ("[^ \\ d]", "")] [1] [1]: stackoverflow.com/questions/1533659/…
bitowa
2
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ą.
Adam Zalcman

Odpowiedzi:

521

Wypróbuj ten kod:

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

Teraz strbędzie zawierać "12.334.78".

Óscar López
źródło
18
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);

odciski

2367.2723

Możesz także zatrzymać -dla liczb ujemnych.

Peter Lawrey
źródło
Nie powinieneś uciekać przed kropką w wyrażeniu regularnym.
Adam Zalcman
Czy mógłbyś podać wyjaśnienie, co oznacza ^i co .oznacza w tym stwierdzeniu?
Mansour Fahad,
1
@MansourFahad W wyrażeniu regularnym [^nie oznacza tych znaków, a wewnątrz []a .jest po prostu.
Peter Lawrey
1
Skoro a .jest tylko a ai nic nie znaczy, czy mogę się go po prostu pozbyć?
Mansour Fahad
@MansourFahad tylko wtedy, gdy nie chcesz żadnych .wyników.
Methodignature
44
String phoneNumberstr = "Tel: 00971-557890-999";
String numberRefined = phoneNumberstr.replaceAll("[^\\d-]", "");

wynik: 0097-557890-999

jeśli nie potrzebujesz również „-” w String, możesz to zrobić w następujący sposób:

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

wynik: 0097557890999

Faakhir
źródło
Dzięki za świetne odpowiedzi !!
shridutt kothari
20

Z guawą:

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

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

Kerem Baydoğan
źródło
1
Dlaczego na świecie miałbyś potrzebować Guawy do tak łatwego i niezbędnego zadania ?!
egorikem
@egorikem, jeśli twój projekt używa już guawy, możesz go używać bez dodatkowych kosztów ..
stan
19
str = str.replaceAll("\\D+","");
Angoranator777
źródło
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:

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
źródło
3

Sposób na zastąpienie go strumieniem 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.
}
Orin
źródło
3

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 znaczy

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

Myślę, że właściwy sposób to:

  • Uzyskaj znak dziesiętny przez DecimalFormatSymbols pomocą domyślnego ustawienia regionalnego lub określonego.
  • Gotuj wzór regularny ze znakiem dziesiętnym, aby uzyskać tylko cyfry

A oto jak to rozwiązuję:

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

kod:

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

Mam nadzieję, że to może pomóc ”.

Maher Abuthraa
źródło
3

Dla osób z Androidem przybywających tutaj po Kotlin

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

Wynik:

cleanString = "12345.67"

To może być następnie bezpiecznie przekształcone toDouble(), toFloat()lub toInt()w razie potrzeby

Michael
źródło
Lub Number, w czystej Javie.
Alex Byrth,