Java String menghapus semua karakter non numerik


237

Mencoba menghapus semua huruf dan karakter yang bukan 0-9 dan titik. Saya menggunakan Character.isDigit()tetapi juga menghilangkan desimal, bagaimana saya bisa juga menjaga desimal?


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

2
Ini cara yang aneh untuk mengatakan ini. Bukankah "semua huruf dan karakter yang bukan 0-9 dan periode" setara dengan lebih sederhana "semua karakter yang bukan 0-9 dan suatu periode"? Maksud saya, huruf adalah karakter yang bukan 0-9 atau titik.
Adam Zalcman

Jawaban:


521

Coba kode ini:

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

Sekarang strakan berisi "12.334.78".


18
Ini juga bisa berfungsi:> str = str.replaceAll ("[\\ D.]", "");
yeaaaahhhh..hamf hamf

1
@ Óscar López: bagaimana cara memasukkan angka negatif juga? Maksud saya, saya harus mengganti semua yang bukan angka positif / negatif dengan ruang kosong. Bagaimana cara melakukannya?
Pankaj Singhal

3
@PankajSinghal cukup menyertakan tanda minus di regex:[^\\d.-]
Óscar López

3
@ yeaaaahhhh..hamfhamf tidak, itu tidak akan berhasil. Kami harus menegasikan seluruh grup (termasuk angka dan titik), kode yang Anda sarankan hanya meniadakan angka, dan hasilnya tidak akan termasuk titik, seperti yang diperlukan. Apakah Anda mengujinya ? menggunakan kode contoh di atas, kode Anda kembali "1233478", yang tidak benar.
Óscar López

Bekerja dengan sangat baik bahkan di Android. Terima kasih.
juanram0n

98

Saya akan menggunakan regex.

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

cetakan

2367.2723

Anda mungkin ingin menyimpan -juga untuk angka negatif.


Anda tidak boleh luput dari titik di regexp Anda.
Adam Zalcman

Bisakah Anda memberikan penjelasan untuk apa ^dan .artinya dalam pernyataan ini?
Mansour Fahad

1
@MansourFahad Dalam regex [^berarti bukan karakter ini dan di dalam huruf []a .hanyalah.
Peter Lawrey

1
Karena a .hanya adan tidak berarti apa-apa, bisakah saya menyingkirkannya?
Mansour Fahad

@MansourFahad hanya jika Anda ingin tidak ada .dalam hasil Anda.
metode tanda tangan

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

hasil: 0097-557890-999

jika Anda juga tidak perlu "-" di String, Anda dapat melakukannya seperti ini:

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

hasil: 0097557890999


Terima kasih untuk jawaban hebat !! r
shridutt kothari


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

Entah mengapa orang menurunkan solusi Anda ... Membantu saya banyak, terima kasih! Pilih!
Zarial

Terima kasih Zarial, saya melihat Robert benar-benar mengedit jawaban saya dari str = str.replaceAll ("\ D +", ""); to str = str.replaceAll ("\\ D +", ""); ... Jadi saya membuat kesalahan ini ketika menempelkannya ke kotak editor StackO. Jadi terima kasih Robert sudah memperbaikinya. Sekarang berhasil!
Angoranator777

itu diturunkan karena itu repost. Jawaban yang persis sama telah diajukan 5 tahun yang lalu !! lihat di atas: stackoverflow.com/a/10372905/704246
Saad Benbouzid

@ SaadBenbouzid ya? apa definisi Anda dari jawaban yang sama persis?
Boris Treukhov

2
@ SaadBenbouzid 1) itu adalah komentar dan bukan jawaban 2) itu adalah regex yang sama sekali berbeda 3) tidak semua jawaban yang menggunakan regex D identik seperti menunjukkan bahwa semua jawaban bahasa C yang digunakan printf()adalah duplikat. Juga jika Anda melihat jawaban dalam komentar, Anda dapat meminta mod untuk mengubahnya menjadi jawaban atau bahkan menambahkan jawaban sendiri - jawaban dalam komentar tidak disarankan di StackOverlow.
Boris Treukhov

6

Cara sederhana tanpa menggunakan Regex:

Menambahkan tanda karakter tambahan untuk titik '.'akan menyelesaikan persyaratan:

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

Cara untuk menggantinya dengan java 8 stream:

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

Pemisah desimal mata uang dapat berbeda dari Lokal ke yang lain. Itu bisa berbahaya untuk dipertimbangkan .sebagai pemisah selalu. yaitu

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

Saya pikir cara yang tepat adalah:

  • Dapatkan karakter desimal melalui DecimalFormatSymbolssecara default Lokal atau yang ditentukan.
  • Masak pola regex dengan karakter desimal untuk mendapatkan digit saja

Dan di sini bagaimana saya menyelesaikannya:

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

kode:

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

Saya harap itu bisa membantu, '.


3

Untuk orang-orang Android yang datang ke sini untuk Kotlin

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

Keluaran:

cleanString = "12345.67"

Ini kemudian dapat dikonversi dengan aman toDouble(), toFloat()atau toInt()jika perlu


Atau Angka, di Jawa murni.
Alex Byrth

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.