Saya memiliki string yang saya muat di seluruh aplikasi saya, dan itu berubah dari angka menjadi huruf dan semacamnya. Saya memiliki if
pernyataan sederhana untuk melihat apakah itu mengandung huruf atau angka tetapi, ada sesuatu yang tidak berfungsi dengan benar. Ini potongannya.
String text = "abc";
String number;
if (text.contains("[a-zA-Z]+") == false && text.length() > 2) {
number = text;
}
Meskipun text
variabel tidak mengandung huruf, kondisinya kembali sebagai true
. Dan &&
harus mengevaluasi karena kedua kondisi harus true
untuk memprosesnumber = text;
==============================
Larutan:
Saya dapat menyelesaikan ini dengan menggunakan kode berikut yang disediakan oleh komentar pada pertanyaan ini. Semua posting lain juga valid!
Apa yang saya gunakan yang berfungsi berasal dari komentar pertama. Meskipun semua kode contoh yang diberikan tampaknya juga valid!
String text = "abc";
String number;
if (Pattern.matches("[a-zA-Z]+", text) == false && text.length() > 2) {
number = text;
}
sumber
matches("\\d{2,}")
atau coba denganPattern
danMatcher
Pattern.matches("[a-zA-Z]+", text) == false
dapat disederhanakan menjadi!Pattern.matches("[a-zA-Z]+", text)
boolean isNumeric = someString.chars().allMatch(x -> Character.isDigit(x));
bentukMax Malysh
posting.Jawaban:
Jika Anda akan memproses angka sebagai teks, maka ubah:
untuk:
Alih-alih memeriksa bahwa string tidak mengandung karakter alfabet, periksa untuk memastikan string hanya berisi angka.
Jika Anda benar-benar ingin menggunakan nilai numerik, gunakan
Integer.parseInt()
atauDouble.parseDouble()
seperti yang dijelaskan orang lain di bawah ini.Sebagai catatan, umumnya dianggap praktik buruk untuk membandingkan nilai boolean
true
ataufalse
. Cukup gunakanif (condition)
atauif (!condition)
.sumber
^[0-9]+$
) Jika tidakabc123def
akan dianggap angka.matches()
mengembalikan true jika dan hanya jika itu benar-benar cocok dari awal hingga akhir.&& (text.length() > 2)
. Semuanya dapat diperiksa dalam pola regex:if (text.matches("[0-9]{3,}")
Anda juga dapat menggunakan NumberUtil.isCreatable (String str) dari Apache Commons
sumber
NumberUtil.isCreatable(String str)
itu tidak benar untuk digunakan untuk apa yang ditanyakan oleh pertanyaan awal. Misalnya,NumberUtil.isCreatable( "09" )
pengembalianfalse
, meskipun"09"
hanya berisi angka .Inilah yang akan saya lakukan:
The
$
akan menghindari parsial pertandingan misalnya;1B
.sumber
text.length() > 2
bagian, jadi saya hanya mengganti^[0-9]*$
dengan^[0-9]+$
untuk memastikan saya memiliki setidaknya satu nomor.Kinerja-bijaksana
parseInt
dan semacamnya jauh lebih buruk daripada solusi lain, karena setidaknya memerlukan penanganan pengecualian.Saya telah menjalankan tes jmh dan telah menemukan bahwa iterasi dari String menggunakan
charAt
dan membandingkan karakter dengan karakter batas adalah cara tercepat untuk menguji apakah string hanya berisi angka.Pengujian JMH
Tes membandingkan kinerja nilai char
Character.isDigit
vsPattern.matcher().matches
vsLong.parseLong
vs.Cara-cara ini dapat menghasilkan hasil yang berbeda untuk string non-ascii dan string yang mengandung tanda +/-.
Tes dijalankan dalam mode Throughput ( lebih besar lebih baik ) dengan 5 iterasi pemanasan dan 5 iterasi tes.
Hasil
Perhatikan bahwa
parseLong
hampir 100 kali lebih lambat daripadaisDigit
untuk beban uji pertama.Suite uji
Diperbarui pada 23 Feb 2018
charAt
alih-alih membuat array tambahan dan menggunakanIntStream
kode char lainnyaDiperbarui pada 23 Feb 2018
sumber
Untuk cukup memeriksa string yang hanya berisi ALPHABETS, gunakan kode berikut:
Untuk memeriksa string yang berisi NUMBER hanya gunakan kode berikut:
Semoga ini bisa membantu seseorang!
sumber
boolean isNum = text.chars (). allMatch (c -> c> = 48 && c <= 57)
sumber
boolean isNum = text.chars().allMatch(c -> c >= '0' && c <= '9')
Anda dapat menggunakan Regex.Match
Atau Anda dapat menggunakan konversi suka
Integer.parseInt(String)
atau lebih baikLong.parseLong(String)
untuk angka yang lebih besar seperti misalnya:Dan kemudian uji dengan:
sumber
Regex di bawah ini dapat digunakan untuk memeriksa apakah string hanya memiliki nomor atau tidak:
if (str.matches(".*[^0-9].*")) or if (str.matches(".*\\D.*"))
Kedua kondisi di atas akan kembali
true
jika String berisi non-angka. Nyalafalse
, string hanya memiliki angka.sumber
Apache Commons Lang menyediakan
org.apache.commons.lang.StringUtils.isNumeric(CharSequence cs)
, yang mengambil sebagai argumen aString
dan memeriksa apakah itu terdiri dari karakter numerik murni (termasuk angka dari skrip non-Latin). Metode itu kembalifalse
jika ada karakter seperti pemisah spasi, minus, plus, dan desimal seperti koma dan titik.Metode lain dari kelas itu memungkinkan untuk pemeriksaan numerik lebih lanjut.
sumber
public static boolean isNumeric(String str) { if (str == null) { return false; } else { int sz = str.length(); for(int i = 0; i < sz; ++i) { if (!Character.isDigit(str.charAt(i))) { return false; } } return true; } }
Ada banyak fasilitas untuk mendapatkan nomor dari
String
di Jawa (dan sebaliknya). Anda mungkin ingin melewati bagian regex untuk menghindari kerumitan itu sendiri.Misalnya, Anda dapat mencoba dan melihat apa yang
Double.parseDouble(String s)
kembali untuk Anda. Ini harus melemparNumberFormatException
jika tidak menemukan nilai yang sesuai dalam string. Saya akan menyarankan teknik ini karena Anda benar-benar dapat menggunakan nilai yang diwakili olehString
sebagai tipe numerik.sumber
Ini kode saya, semoga ini membantu Anda!
sumber
Kode ini sudah ditulis. Jika Anda tidak keberatan dengan hit kinerja sangat kecil - yang mungkin tidak lebih buruk daripada melakukan pertandingan regex - gunakan Integer.parseInt () atau Double.parseDouble () . Itu akan memberitahu Anda segera jika String hanya nomor (atau adalah nomor, yang sesuai). Jika Anda perlu menangani string angka yang lebih lama, konstruktor olahraga BigInteger dan BigDecimal yang menerima string. Semua ini akan melempar NumberFormatException jika Anda mencoba memberikannya non-angka (integral atau desimal, berdasarkan yang Anda pilih, tentu saja). Bergantian, tergantung pada kebutuhan Anda, hanya iterate karakter dalam String dan periksa Character.isDigit ()dan / atau Character.isLetter () .
sumber
sumber
sumber
Contoh tes kerja
Masih kode Anda dapat dipecah oleh "1a" dll sehingga Anda perlu memeriksa pengecualian
Metode untuk memeriksa tidak adalah string atau tidak
sumber
Merupakan praktik yang buruk untuk melibatkan pengecualian melempar / menangani skenario seperti itu.
Oleh karena itu parseInt () tidak bagus, tetapi regex adalah solusi yang elegan untuk ini, tetapi perhatikan hal berikut:
-fraksi
-negatif angka
-Pemisah spesifik mungkin berbeda dalam contries (misalnya ',' atau '.')
-Sometimes itu diizinkan untuk memiliki apa yang disebut pemisah ribuan, seperti spasi atau koma misalnya 12.324.1000.355
Untuk menangani semua kasus yang diperlukan dalam aplikasi Anda, Anda harus berhati-hati, tetapi regex ini mencakup skenario tipikal (positif / negatif dan fraksional, dipisahkan oleh titik): ^ [- +]? \ D *.? \ D + $
Untuk pengujian, saya sarankan regexr.com .
sumber
Versi Adam Bodrogi yang sedikit dimodifikasi:
Harus menggunakan ini hari ini jadi pasang saja modifikasi saya. Termasuk mata uang, ribuan koma atau notasi periode, dan beberapa validasi. Tidak termasuk notasi mata uang lainnya (euro, sen), koma verifikasi adalah setiap digit ketiga.
sumber