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.