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?

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

Óscar López
sumber
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.

Peter Lawrey
sumber
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

Faakhir
sumber
Terima kasih untuk jawaban hebat !! r
shridutt kothari
20

Dengan jambu biji:

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

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

Kerem Baydoğan
sumber
1
Kenapa kau membutuhkan Jambu untuk tugas yang mudah dan penting ?!
egorikem
@egorikem jika proyek Anda sudah menggunakan jambu biji, Anda dapat menggunakannya tanpa biaya tambahan ..
stan
19
str = str.replaceAll("\\D+","");
Angoranator777
sumber
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();
}
shridutt kothari
sumber
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.
}
Orin
sumber
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, '.

Maher Abuthraa
sumber
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

Michael
sumber
Atau Angka, di Jawa murni.
Alex Byrth