Java String sayısal olmayan tüm karakterleri kaldır


237

0-9 ve nokta olmayan tüm harfleri ve karakterleri kaldırmaya çalışıyorum. Ben kullanıyorum Character.isDigit()ama ondalık da kaldırır, ondalık nasıl tutabilirim?


4
[myStr = myStr.replaceAll ("[^ \\ d]", "")] [1] [1]: stackoverflow.com/questions/1533659/…
Bitmap

2
Bunu söylemenin garip bir yolu. "0-9 olmayan tüm harfler ve karakterler ve nokta" daha basit olana eşdeğer "değil, 0-9 olmayan tüm karakterler ve nokta" değil mi? Yani, harfler 0-9 ya da nokta olmayan karakterlerdir.
Adam Zalcman

Yanıtlar:


521

Bu kodu deneyin:

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

Şimdi striçerecek "12.334.78".


18
Bu da işe yarayabilir:> str = str.replaceAll ("[\\ D.]", "");
yeaaaahhhh..hamf hamf

1
@ Lópezscar López: negatif sayılar da nasıl dahil edilir? Yani, pozitif / negatif bir sayı olmayan her şeyi boş bir alanla değiştirmek zorundayım. Bu nasıl yapılır?
Pankaj Singhal

3
@PankajSinghal normalde eksi işaretini ekleyin:[^\\d.-]
López

3
@ yeaaaahhhh..hamfhamf hayır, bu işe yaramaz. Grubun tamamını (sayılar ve noktalar dahil) reddetmeliyiz, önerilen kodunuz yalnızca sayıları reddeder ve sonuç gerektiği gibi noktaları içermez. Test ettin mi? yukarıdaki örnek kodu kullanarak, kodunuz döner "1233478", bu yanlıştır.
Lópezscar López

Android'de bile çok iyi çalışıyor. Teşekkürler.
juanram0n

98

Normal ifade kullanırdım.

String text = "-jaskdh2367sd.27askjdfh23";
String digits = text.replaceAll("[^0-9.]", "");
System.out.println(digits);

baskılar

2367.2723

-Negatif sayılar için de tutmak isteyebilirsiniz .


Normal ifadenizdeki noktadan kaçmamalısınız.
Adam Zalcman

Bu açıklamada ne anlama geldiğini ^ve ne anlama .geldiğini açıklayabilir misiniz?
Mansour Fahad

1
Regex olarak @MansourFahad [^bu karakterlerin değil araçlarının ve bir iç []a .sadece bir.
Peter Lawrey

1
A .sadece bir olduğu ave hiçbir şey ifade etmediği için ondan kurtulabilir miyim?
Mansour Fahad

@MansourFahad sadece .sonucunuzda hiç istemiyorsanız .
methodignature

44
String phoneNumberstr = "Tel: 00971-557890-999";
String numberRefined = phoneNumberstr.replaceAll("[^\\d-]", "");

sonuç: 0097-557890-999

Dize'de de "-" ye ihtiyacınız yoksa bunu yapabilirsiniz:

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

sonuç: 0097557890999


Büyük
answe


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

İnsanların çözümünüzü neden düşürdüğünü bilmiyorum ... Bana çok yardımcı oldu, teşekkürler! Oy verin!
Zarial

Teşekkürler Zarial, Robert aslında cevabımı str = str.replaceAll ("\ D +", ""); to str = str.replaceAll ("\\ D +", ""); ... Yani bu hatayı StackO'nun editör kutusuna yapıştırırken yaptım. Düzelttiğiniz için teşekkür ederim Robert. Şimdi çalışıyor!
Angoranator777

indirildi çünkü bu bir repost. Tam olarak aynı cevap 5 yıl önce vurgulanmıştır !! yukarıya bakın: stackoverflow.com/a/10372905/704246
Saad Benbouzid

@SaadBenbouzid ha? tam olarak aynı cevabın tanımı nedir?
Boris Treukhov

2
@SaadBenbouzid 1) bu bir yorum değil, bir cevap değil 2) tamamen farklı bir normal ifade 3) regex D kullanan tüm cevaplar aynı değildir, bu, kullanılan tüm C dil cevaplarının printf()yinelendiğini göstermek gibidir. Ayrıca yorumda bir cevap görürseniz moddan cevabı dönüştürmesini isteyebilir veya kendi başına bir cevap bile ekleyebilirsiniz - yorumlardaki cevaplar StackOverlow'da önerilmez.
Boris Treukhov

6

Regex kullanmadan basit bir yol:

Nokta için ekstra bir karakter kontrolü eklemek '.'gereksinimi çözecektir:

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

Bir java 8 akışı ile değiştirmenin bir yolu:

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

Para birimi ondalık ayırıcısı Yerel Ayardan diğerine farklı olabilir. Her .zaman ayırıcı olarak düşünmek tehlikeli olabilir . yani

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

Bence doğru yol:

  • Üzerinden ondalık karakter al DecimalFormatSymbolsVarsayılan Yerel Ayar veya belirtilen .
  • Yalnızca rakam elde etmek için regex desenini ondalık karakterle pişirin

Ve işte nasıl çözüyorum:

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

Umarım bu yardımcı olabilir '.


3

Kotlin için buraya gelen Android kullanıcıları için

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

Çıktı:

cleanString = "12345.67"

Bu daha sonra güvenli bir şekilde dönüştürülmüş olabilir toDouble(), toFloat()ya da toInt()eğer gerekli


Veya Sayı, saf Java ile.
Alex Byrth

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.