Saya biasanya menggunakan idiom berikut untuk memeriksa apakah sebuah String dapat dikonversi ke integer.
public boolean isInteger( String input ) {
try {
Integer.parseInt( input );
return true;
}
catch( Exception e ) {
return false;
}
}
Apakah hanya saya, atau apakah ini terlihat agak merdu? Apa cara yang lebih baik?
Lihat jawaban saya (dengan tolok ukur, berdasarkan jawaban sebelumnya oleh CodingWithSpike ) untuk melihat mengapa saya membalik posisi saya dan menerima jawaban Jonas Klemming untuk masalah ini. Saya pikir kode asli ini akan digunakan oleh kebanyakan orang karena lebih cepat untuk diimplementasikan, dan lebih dapat dipelihara, tetapi urutan besarnya lebih lambat ketika data non-integer disediakan.
Jawaban:
Jika Anda tidak khawatir dengan potensi masalah luapan, fungsi ini akan melakukan sekitar 20-30 kali lebih cepat daripada menggunakan
Integer.parseInt()
.sumber
Anda memilikinya, tetapi Anda seharusnya hanya menangkap
NumberFormatException
.sumber
Melakukan patokan cepat. Pengecualian sebenarnya tidak terlalu mahal, kecuali jika Anda mulai membuka kembali banyak metode dan JVM harus melakukan banyak pekerjaan untuk mendapatkan tumpukan eksekusi di tempat. Ketika tetap menggunakan metode yang sama, mereka bukan berkinerja buruk.
Keluaran:
Saya setuju bahwa solusi Jonas K adalah yang paling kuat juga. Sepertinya dia menang :)
sumber
^
dan$
kedua kalinya sejak dimatches
seluruh string harus sesuai regex, (2)str.matches
setiap kali akan harus membuat sendiriPattern
yang mahal. Untuk alasan kinerja, kita harus membuat Pola seperti itu hanya sekali di luar metode ini dan menggunakannya di dalam. (3) Kami juga dapat membuat hanya satu objek Pencocokan dan menggunakannyareset(CharSequence)
untuk meneruskan data pengguna dan mengembalikanmatches()
hasilnya.private final Matcher m = Pattern.compile("-?\\d+").matcher(""); private boolean byRegex(String str) { return m.reset(str).matches(); }
harus memiliki kinerja yang lebih baik.matches
ditambahkan^
dan$
secara implisit. Lihatlah hasil" 123".matches("\\d+")
dan"123".matches("\\d+")
. Anda akan melihatfalse
dantrue
.false
akan dikembalikan karena string dimulai dengan ruang yang mencegahnya tidak sepenuhnya cocok dengan regex.Karena ada kemungkinan orang masih berkunjung ke sini dan akan bias terhadap Regex setelah tolok ukur ... Jadi saya akan memberikan versi terbaru dari tolok ukur, dengan versi kompilasi dari Regex. Yang bertentangan dengan tolok ukur sebelumnya, yang satu ini menunjukkan solusi Regex sebenarnya memiliki kinerja yang baik secara konsisten.
Disalin dari Bill the Lizard dan diperbarui dengan versi kompilasi:
Hasil:
sumber
336
."^[+-]?\\d+$"
akan lebih baik.meskipun lib standar Java benar-benar melewatkan fungsi utilitas tersebut
Saya pikir Apache Commons adalah "harus memiliki" untuk setiap programmer Java
Sayang sekali itu belum porting ke Java5
sumber
Sebagian tergantung pada apa yang Anda maksud dengan "dapat dikonversi ke integer".
Jika maksud Anda "dapat dikonversi menjadi int di Jawa" maka jawaban dari Jonas adalah awal yang baik, tetapi tidak cukup menyelesaikan pekerjaan. Itu akan melewati 999999999999999999999999999999 misalnya. Saya akan menambahkan panggilan try / catch normal dari pertanyaan Anda sendiri di akhir metode.
Pemeriksaan karakter-per-karakter akan secara efisien menolak kasus "bukan bilangan bulat", meninggalkan kasus "bilangan bulat tetapi Java tidak dapat mengatasinya" untuk ditangkap oleh rute pengecualian yang lebih lambat. Anda bisa melakukannya sedikit dengan tangan juga, tetapi itu akan jauh lebih rumit.
sumber
Hanya satu komentar tentang regexp. Setiap contoh yang diberikan di sini salah !. Jika Anda ingin menggunakan regexp jangan lupa bahwa mengompilasi polanya membutuhkan banyak waktu. Ini:
dan juga ini:
menyebabkan kompilasi pola dalam setiap pemanggilan metode. Untuk menggunakannya dengan benar ikuti:
sumber
Ada versi jambu biji:
Ini akan mengembalikan nol alih-alih melempar pengecualian jika gagal mengurai string.
sumber
Saya menyalin kode dari jawaban rally25rs dan menambahkan beberapa tes untuk data non-integer. Hasilnya tidak dapat disangkal mendukung metode yang diposting oleh Jonas Klemming. Hasil untuk metode Pengecualian yang awalnya saya posting cukup baik ketika Anda memiliki data integer, tetapi mereka yang terburuk ketika Anda tidak, sedangkan hasil untuk solusi RegEx (yang saya yakinkan banyak orang akan menggunakan) secara konsisten buruk. Lihat jawaban Felipe untuk contoh regex yang dikompilasi, yang jauh lebih cepat.
Hasil:
sumber
Ini lebih pendek, tetapi lebih pendek tidak selalu lebih baik (dan itu tidak akan menangkap nilai integer yang berada di luar jangkauan, seperti yang ditunjukkan dalam komentar danatel ):
Secara pribadi, karena implementasi disemprotkan dalam metode helper dan panjang truf kebenaran, saya hanya akan pergi dengan sesuatu seperti apa yang Anda miliki (dikurangi menangkap
Exception
kelas dasar daripadaNumberFormatException
).sumber
Anda dapat menggunakan metode kecocokan dari kelas string. Tanda [0-9] mewakili semua nilai yang ada, + berarti panjangnya setidaknya satu karakter, dan * berarti panjangnya bisa nol atau lebih karakter.
sumber
Bagaimana tentang:
sumber
Ini adalah variasi Java 8 dari jawaban Jonas Klemming:
Kode uji:
Hasil dari kode tes:
sumber
Anda cukup memeriksa NumberFormatException : -
sumber
Jika array String Anda berisi Integer dan Strings murni, kode di bawah ini akan berfungsi. Anda hanya perlu melihat karakter pertama. mis. ["4", "44", "abc", "77", "bond"]
sumber
Anda juga dapat menggunakan kelas Pemindai , dan menggunakan hasNextInt () - dan ini memungkinkan Anda untuk menguji tipe lainnya, seperti float, dll.
sumber
Jika Anda ingin memeriksa apakah string mewakili bilangan bulat yang cocok dengan tipe int, saya melakukan sedikit modifikasi pada jawaban jonas, sehingga string yang mewakili bilangan bulat lebih besar dari Integer.MAX_VALUE atau lebih kecil dari Integer.MIN_VALUE, sekarang akan kembali Salah. Misalnya: "3147483647" akan mengembalikan false karena 3147483647 lebih besar dari 2147483647, dan juga, "-2147483649" juga akan kembali palsu karena -2147483649 lebih kecil dari -2147483648.
sumber
trim()
sehingga jelas merupakan pilihan desain yang disengaja.Anda dapat mencoba utilitas apache
Lihat javadoc di sini
sumber
isCreateable(String)
.Anda mungkin perlu mempertimbangkan juga use case di akun:
Jika sebagian besar waktu Anda mengharapkan angka valid, maka menangkap pengecualian hanya menyebabkan overhead kinerja ketika mencoba mengkonversi angka yang tidak valid. Sedangkan memanggil beberapa
isInteger()
metode dan kemudian mengonversi menggunakanInteger.parseInt()
akan selalu menyebabkan overhead kinerja untuk angka yang valid - string diurai dua kali, sekali oleh cek dan sekali oleh konversi.sumber
Ini adalah modifikasi dari kode Jonas yang memeriksa apakah string dalam jangkauan untuk dilemparkan ke dalam integer.
sumber
Jika Anda menggunakan Android API Anda dapat menggunakan:
sumber
Pilihan lain:
sumber
sumber
Apa yang Anda lakukan berhasil, tetapi Anda mungkin tidak harus selalu memeriksa seperti itu. Melempar pengecualian harus disediakan untuk situasi "luar biasa" (mungkin cocok untuk kasus Anda), dan sangat mahal dalam hal kinerja.
sumber
sumber
Ini hanya akan berfungsi untuk bilangan bulat positif.
sumber
Ini bekerja untuk saya. Cukup untuk mengidentifikasi apakah suatu String adalah primitif atau angka.
sumber
Untuk memeriksa semua karakter int, Anda cukup menggunakan negatif ganda.
if (! searchString.matches ("[^ 0-9] + $")) ...
[^ 0-9] + $ memeriksa untuk melihat apakah ada karakter yang tidak bilangan bulat, jadi tes gagal jika itu benar. Hanya BUKAN itu dan Anda menjadi kenyataan pada kesuksesan.
sumber
matches
Metode pertandingan melawan seluruh string, bukan hanya sebagian darinya.if
blok. Seharusnya tidak.Temukan ini mungkin membantu:
sumber
Saya percaya tidak ada risiko yang menimpa pengecualian, karena seperti yang Anda lihat di bawah ini, Anda selalu aman
int
untuk parsingString
dan bukan sebaliknya.Begitu:
Anda memeriksa apakah setiap slot karakter di string Anda cocok dengan setidaknya satu karakter {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"} .
Anda menjumlahkan semua waktu yang Anda temui di slot karakter di atas.
Dan akhirnya Anda memeriksa apakah waktu yang Anda temui integer sebagai karakter sama dengan panjang string yang diberikan.
Dan dalam praktiknya kita memiliki:
Dan hasilnya adalah:
Demikian pula, Anda dapat memvalidasi jika a
String
adalah afloat
atau adouble
tetapi dalam kasus-kasus tersebut Anda hanya perlu menjumpai satu. (dot) di String dan tentu saja periksa apakahdigits == (aString.length()-1)
Saya harap saya membantu
sumber