Periksa apakah String berisi angka Java

102

Saya sedang menulis program di mana pengguna memasukkan String dalam format berikut:

"What is the square of 10?"
  1. Saya perlu memeriksa apakah ada nomor di String
  2. lalu ekstrak angkanya saja.
  3. Jika saya menggunakan .contains("\\d+")atau .contains("[0-9]+"), program tidak dapat menemukan nomor di String, tidak peduli apa inputnya, tetapi .matches("\\d+")hanya akan berfungsi jika hanya ada angka.

Apa yang dapat saya gunakan sebagai solusi untuk menemukan dan mengekstrak?

Duane
sumber
Jika Anda ingin mengekstrak angka pertama, bukan hanya digit dari string input, lihat jawaban saya.
Sajal Dutta

Jawaban:

230

coba ini

str.matches(".*\\d.*");
Evgeniy Dorofeev
sumber
2
apa fungsi garis miring terbalik ganda?
ankit
15
Untuk menjelaskan:. * Berarti karakter apa pun dari 0 hingga kejadian tak terbatas, daripada \\ d + (garis miring terbalik ganda menurut saya hanya untuk menghindari garis miring terbalik kedua) dan \ d + berarti digit dari 1 waktu hingga tak terbatas.
Giudark
6
Ini bukan sihir alien, itu BS rahasia, kembali dari hari-hari ketika tidak ada yang bisa melakukan hal ini kecuali para insinyur yang menemukannya karena pada dasarnya itu adalah kode rahasia yang hanya diketahui pembuatnya sampai mereka membagikannya.
JamisonMan111
Dimodifikasi, karena jika hanya ada satu digit, solusi sudah cukup baik, tidak perlu 1 digit atau lebih dalam hal ini.
Yassin Hajaj
26

Jika Anda ingin mengekstrak angka pertama dari string input, Anda dapat melakukan-

public static String extractNumber(final String str) {                
    
    if(str == null || str.isEmpty()) return "";
    
    StringBuilder sb = new StringBuilder();
    boolean found = false;
    for(char c : str.toCharArray()){
        if(Character.isDigit(c)){
            sb.append(c);
            found = true;
        } else if(found){
            // If we already found a digit before and this char is not a digit, stop looping
            break;                
        }
    }
    
    return sb.toString();
}

Contoh:

Untuk masukan "123abc", metode di atas akan mengembalikan 123.

Untuk "abc1000def", 1000.

Untuk "555abc45", 555.

Untuk "abc", akan mengembalikan string kosong.

Sajal Dutta
sumber
11

Saya pikir ini lebih cepat dari regex.

public final boolean containsDigit(String s) {
    boolean containsDigit = false;

    if (s != null && !s.isEmpty()) {
        for (char c : s.toCharArray()) {
            if (containsDigit = Character.isDigit(c)) {
                break;
            }
        }
    }

    return containsDigit;
}
Melih Altıntaş
sumber
Maaf saya tidak melihat ekstraksi. Jika Anda ingin mengekstrak nomor dalam string, Anda dapat dengan mudah mengedit kode ini.
Melih Altıntaş
10

s=s.replaceAll("[*a-zA-Z]", "") menggantikan semua huruf

s=s.replaceAll("[*0-9]", "") menggantikan semua angka

jika Anda melakukan di atas dua penggantian, Anda akan mendapatkan semua string berkarakter khusus

Jika Anda ingin mengekstrak hanya bilangan bulat dari a String s=s.replaceAll("[^0-9]", "")

Jika Anda hanya ingin mengekstrak Abjad dari file String s=s.replaceAll("[^a-zA-Z]", "")

Selamat coding :)

Mallikarjuna Sangisetty
sumber
10

Saya tidak dapat menemukan satu pola pun yang benar. Silakan ikuti panduan di bawah ini untuk solusi kecil dan manis.

String regex = "(.)*(\\d)(.)*";      
Pattern pattern = Pattern.compile(regex);
String msg = "What is the square of 10?";
boolean containsNumber = pattern.matcher(msg).matches();
Ishaan
sumber
Ini bekerja dengan sangat baik. Satu-satunya hal yang perlu Anda perhatikan adalah jika string berisi garis miring ke belakang. Jika ya, maka saya pikir ini akan menghasilkan kesalahan "karakter melarikan diri ilegal".
w3bshark
ini yang terbaik
Yashwin Munsadwala
9

Kode di bawah ini cukup untuk "Periksa apakah String berisi angka di Java"

Pattern p = Pattern.compile("([0-9])");
Matcher m = p.matcher("Here is ur string");

if(m.find()){
    System.out.println("Hello "+m.find());
}
Narendra
sumber
8
Pattern p = Pattern.compile("(([A-Z].*[0-9])");
Matcher m = p.matcher("TEST 123");
boolean b = m.find();
System.out.println(b);
Reddy
sumber
3
Baris pertama memiliki kesalahan kecil, tanda kurung tidak ada di String. Pola p = Pola.kompilasi ("(([AZ]. * [0-9]))");
Gaurav Tyagi
juga, ini tidak berhasil ... pengujian berfungsi, tetapi 123TEST tidak akan berfungsi.
fergal_dd
7

Coba pola berikut:

.matches("[a-zA-Z ]*\\d+.*")
Konstantin Yovkov
sumber
Namun jika pengguna sopan dan mengatakan "please"ini akan gagal. Ditambah dalam contoh OP, ada "?" untuk menjelaskan.
Christopher
1
Anda yakin sudah memperbaikinya?
Christopher
Ekspresi ini tidak berfungsi untuk jawaban seperti "10"sampel.
fabdouglas
6

Solusi yang saya gunakan terlihat seperti ini:

Pattern numberPat = Pattern.compile("\\d+");
Matcher matcher1 = numberPat.matcher(line);

Pattern stringPat = Pattern.compile("What is the square of", Pattern.CASE_INSENSITIVE);
Matcher matcher2 = stringPat.matcher(line);

if (matcher1.find() && matcher2.find())
{
    int number = Integer.parseInt(matcher1.group());                    
    pw.println(number + " squared = " + (number * number));
}

Saya yakin ini bukan solusi yang tepat, tetapi sesuai dengan kebutuhan saya. Terima kasih atas bantuannya. :)

Duane
sumber
1

Anda bisa mencobanya

String text = "ddd123.0114cc";
    String numOnly = text.replaceAll("\\p{Alpha}","");
    try {
        double numVal = Double.valueOf(numOnly);
        System.out.println(text +" contains numbers");
    } catch (NumberFormatException e){
        System.out.println(text+" not contains numbers");
    }     
Ruchira Gayan Ranaweera
sumber
1

Karena Anda tidak hanya ingin mencari angka tetapi juga mengekstraknya, Anda harus menulis fungsi kecil yang melakukannya untuk Anda. Lakukan huruf demi huruf sampai Anda menemukan satu digit. Ah, baru saja menemukan kode yang diperlukan untuk Anda di stackoverflow: temukan integer dalam string . Lihat jawaban yang diterima.

Thorsten Kettner
sumber
1
public String hasNums(String str) {
        char[] nums = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
        char[] toChar = new char[str.length()];
        for (int i = 0; i < str.length(); i++) {
            toChar[i] = str.charAt(i);
            for (int j = 0; j < nums.length; j++) {
                if (toChar[i] == nums[j]) { return str; }
            }
        }
        return "None";
    }
eyad david
sumber
1

.matches(".*\\d+.*")hanya berfungsi untuk angka tetapi tidak untuk simbol lain seperti //atau *dll.

Rickyras
sumber
0

ASCII ada di awal UNICODE, jadi Anda dapat melakukan sesuatu seperti ini:

(x >= 97 && x <= 122) || (x >= 65 && x <= 90) // 97 == 'a' and 65 = 'A'

Saya yakin Anda bisa mengetahui nilai-nilai lainnya ...

Brad Yuan
sumber