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?


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


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.


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


Dzięki za świetne odpowiedzi !!
shridutt kothari


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

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

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

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


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


Lub Number, w czystej Javie.
Alex Byrth,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.