Bagaimana saya bisa mengonversi a String
ke int
dalam Java?
String saya hanya berisi angka, dan saya ingin mengembalikan nomor yang diwakilinya.
Misalnya, mengingat string "1234"
, hasilnya harus berupa angka 1234
.
java
string
int
type-conversion
Pengguna tidak dikenal
sumber
sumber
Jawaban:
Jika Anda melihat Dokumentasi Java Anda akan melihat "menangkap" adalah bahwa fungsi ini dapat melempar
NumberFormatException
, yang tentu saja Anda harus menangani:(Perawatan ini default ke nomor cacat
0
, tetapi Anda dapat melakukan sesuatu yang lain jika Anda suka.)Atau, Anda dapat menggunakan
Ints
metode dari perpustakaan Guava, yang dikombinasikan dengan Java 8'sOptional
, membuat cara yang kuat dan ringkas untuk mengubah string menjadi int:sumber
int foo = NumberUtils.toInt(myString, 0);
Sebagai contoh, berikut adalah dua cara:
Ada sedikit perbedaan antara metode ini:
valueOf
mengembalikan instance baru atau dalam cache darijava.lang.Integer
parseInt
mengembalikan primitifint
.Hal yang sama untuk semua kasus:
Short.valueOf
/parseShort
,Long.valueOf
/parseLong
, dll.sumber
valueOf
Metode ini hanyareturn valueOf(parseInt(string));
valueOf
menyebut dirinya secara rekursif?valueOf(String)
diimplementasikan dengan terlebih dahulu mengurai String ke int menggunakanparseInt(String)
dan kemudian membungkus int itu dalam Integer dengan menggunakanvalueOf(int)
. Tidak ada rekursi di sini karenavalueOf(String)
danvalueOf(int)
dua fungsi yang sama sekali berbeda, bahkan jika mereka memiliki nama yang sama.Nah, poin yang sangat penting untuk dipertimbangkan adalah bahwa parser Integer melempar NumberFormatException seperti yang dinyatakan dalam Javadoc .
Penting untuk menangani pengecualian ini ketika mencoba untuk mendapatkan nilai integer dari argumen split atau secara dinamis menguraikan sesuatu.
sumber
"([0-9]+)"
akan "menangkap" urutan pertama dari satu atau beberapa digit satu hingga sembilan digit. LihatlahMatcher
kelas dalam paket itu.Lakukan secara manual:
sumber
Integer.parseInt(s)
? - Saya melihat poin tentang ini sebagai pertanyaan wawancara, tetapi a) yang tidak menyiratkan Anda akan melakukannya dengan cara ini (yang ditanyakan oleh si penanya), dan b) jawaban ini adalah contoh yang cukup buruk.Integer.parseInt
karena tidak ada validasi.Solusi alternatif adalah menggunakan NumberUtils Apache Commons ' :
Utilitas Apache bagus karena jika string adalah format angka yang tidak valid maka 0 selalu dikembalikan. Oleh karena itu menghemat blok coba tangkap.
Apache NumberUtils API Versi 3.4
sumber
Saat ini saya sedang mengerjakan tugas untuk kuliah, di mana saya tidak bisa menggunakan ekspresi tertentu, seperti yang di atas, dan dengan melihat tabel ASCII, saya berhasil melakukannya. Ini kode yang jauh lebih kompleks, tetapi bisa membantu orang lain yang dibatasi seperti saya.
Hal pertama yang harus dilakukan adalah menerima input, dalam hal ini, serangkaian digit; Saya akan meneleponnya
String number
, dan dalam hal ini, saya akan mencontohkannya menggunakan nomor 12, oleh karena ituString number = "12";
Keterbatasan lain adalah kenyataan bahwa saya tidak bisa menggunakan siklus berulang, oleh karena itu,
for
siklus (yang seharusnya sempurna) juga tidak dapat digunakan. Ini membatasi kita sedikit, tetapi sekali lagi, itulah tujuannya. Karena saya hanya membutuhkan dua digit (mengambil dua digit terakhir), sederhanacharAt
diselesaikan:Memiliki kode, kita hanya perlu melihat tabel, dan melakukan penyesuaian yang diperlukan:
Sekarang, mengapa ganda? Ya, karena langkah yang benar-benar "aneh". Saat ini kami memiliki dua ganda, 1 dan 2, tetapi kita perlu mengubahnya menjadi 12, tidak ada operasi matematika yang bisa kita lakukan.
Kami membagi yang terakhir (digit terakhir) dengan 10 dalam mode
2/10 = 0.2
(karenanya mengapa ganda) seperti ini:Ini hanya bermain dengan angka. Kami mengubah digit terakhir menjadi desimal. Tapi sekarang, lihat apa yang terjadi:
Tanpa terlalu banyak menghitung, kita hanya mengisolasi satuan angka. Anda tahu, karena kami hanya mempertimbangkan 0-9, membaginya dengan kelipatan 10 adalah seperti membuat "kotak" tempat Anda menyimpannya (pikirkan kembali ketika guru kelas satu Anda menjelaskan kepada Anda berapa satuan dan seratus satuan itu). Begitu:
Dan begitulah. Anda mengubah serangkaian digit (dalam hal ini, dua digit), menjadi bilangan bulat yang terdiri dari dua digit tersebut, dengan mempertimbangkan batasan berikut:
sumber
'0'
karakternya saja48
dan tidak perlu repot dengan nilai numerik yang sebenarnya. Ketiga, seluruh jalan memutar dengandouble
nilai tidak masuk akal sama sekali karena Anda membaginya dengan sepuluh, hanya untuk mengalikannya dengan sepuluh setelahnya. Hasilnya sederhanasemilastdigit * 10 + lastdigit
seperti yang dipelajari di sekolah dasar, ketika sistem desimal diperkenalkan ...semilastdigit
danlastdigit
. Bagaimana Anda memberi kode solusi Anda untuk menghindari "siklus berulang" jika saya memberi Anda string numerik yang valid dengan panjang arbitrer (yaitu, Setiap nilai antara "-2147483648" dan "2147483647"?)Integer.decode
Anda juga bisa menggunakan
public static Integer decode(String nm) throws NumberFormatException
.Ini juga berfungsi untuk basis 8 dan 16:
Jika Anda ingin mendapatkan
int
bukannyaInteger
Anda dapat menggunakan:Menghapus kotak:
intValue()
:sumber
Setiap kali ada kemungkinan sekecil apa pun bahwa String yang diberikan tidak mengandung Integer, Anda harus menangani kasing khusus ini. Sayangnya, metode Java standar
Integer::parseInt
danInteger::valueOf
melemparNumberFormatException
untuk memberi sinyal kasus khusus ini. Dengan demikian, Anda harus menggunakan pengecualian untuk kontrol aliran, yang umumnya dianggap gaya pengkodean yang buruk.Menurut pendapat saya, kasus khusus ini harus ditangani dengan mengembalikan yang kosong
Optional<Integer>
. Karena Java tidak menawarkan metode seperti itu, saya menggunakan pembungkus berikut:Contoh penggunaan:
Meskipun ini masih menggunakan pengecualian untuk kontrol aliran secara internal, kode penggunaan menjadi sangat bersih. Selain itu, Anda dapat dengan jelas membedakan case
-1
yang diuraikan sebagai nilai yang valid dan case di mana String yang tidak valid tidak dapat diuraikan.sumber
Mengubah string ke int lebih rumit daripada hanya mengonversi angka. Anda telah memikirkan masalah-masalah berikut:
sumber
Metode untuk melakukannya:
Integer.valueOf menghasilkan objek Integer, semua metode lain - primitif int.
2 metode terakhir dari commons-lang3 dan artikel besar tentang konversi di sini .
sumber
Kita bisa menggunakan
parseInt(String str)
metodeInteger
kelas wrapper untuk mengubah nilai String ke nilai integer.Sebagai contoh:
The
Integer
kelas juga menyediakanvalueOf(String str)
metode:Kita juga bisa menggunakan
toInt(String strValue)
dari NumberUtils Utilitas Kelas untuk konversi:sumber
Gunakan
Integer.parseInt(yourString)
.Ingatlah hal-hal berikut:
Integer.parseInt("1");
// baikInteger.parseInt("-1");
// baikInteger.parseInt("+1");
// baikInteger.parseInt(" 1");
// Pengecualian (ruang kosong)Integer.parseInt("2147483648");
// Pengecualian (Integer terbatas pada nilai maksimum 2.147.483.647)Integer.parseInt("1.1");
// Pengecualian ( . Atau , atau apa pun yang tidak diizinkan)Integer.parseInt("");
// Pengecualian (bukan 0 atau sesuatu)Hanya ada satu jenis pengecualian:
NumberFormatException
sumber
Saya punya solusi, tetapi saya tidak tahu seberapa efektif itu. Tapi itu bekerja dengan baik, dan saya pikir Anda bisa memperbaikinya. Di sisi lain, saya melakukan beberapa tes dengan JUnit yang langkahnya benar. Saya melampirkan fungsi dan pengujian:
Pengujian dengan JUnit:
sumber
(int) Double.parseDouble(input.replaceAll("[^0-9\\.\\-]", ""));
Google Guava memiliki tryParse (String) , yang kembali
null
jika string tidak dapat diuraikan, misalnya:sumber
Anda juga bisa mulai dengan menghapus semua karakter non-numerik dan kemudian menguraikan integer:
Tetapi berhati-hatilah karena ini hanya berfungsi untuk angka yang tidak negatif
sumber
-42
diuraikan sebagai42
."4+2"
, saya akan mendapatkan42
hasilnya tanpa petunjuk tentang apa yang saya coba lakukan salah arah. Pengguna akan mendapatkan kesan bahwa memasukkan ekspresi dasar seperti4+2
adalah input yang valid, tetapi aplikasi berlanjut dengan nilai yang salah. Selain itu, tipenya adalahString
, bukanstring
...Terlepas dari jawaban sebelumnya, saya ingin menambahkan beberapa fungsi. Ini adalah hasil saat Anda menggunakannya:
Penerapan:
sumber
Seperti yang disebutkan, Apache Commons
NumberUtils
dapat melakukannya. Ia kembali0
jika tidak dapat mengkonversi string ke int.Anda juga dapat menentukan nilai default Anda sendiri:
Contoh:
sumber
Anda dapat menggunakan kode ini juga, dengan beberapa tindakan pencegahan.
Opsi # 1: Tangani pengecualian secara eksplisit, misalnya, menampilkan dialog pesan dan kemudian hentikan eksekusi alur kerja saat ini. Sebagai contoh:
Opsi # 2: Setel ulang variabel yang terpengaruh jika aliran eksekusi dapat dilanjutkan jika ada pengecualian. Misalnya, dengan beberapa modifikasi pada catch catch block
Menggunakan string konstan untuk perbandingan atau segala jenis komputasi selalu merupakan ide yang baik, karena konstanta tidak pernah mengembalikan nilai nol.
sumber
JOptionPane.showMessageDialog()
jawaban untuk pertanyaan vanilla Java tidak masuk akal.Integer.valueOf(String);
tidak mengembalikan tipeint
.Anda bisa menggunakannya
new Scanner("1244").nextInt()
. Atau tanyakan apakah ada int:new Scanner("1244").hasNextInt()
sumber
Dalam kompetisi pemrograman, di mana Anda yakin bahwa angka akan selalu bilangan bulat yang valid, maka Anda dapat menulis metode Anda sendiri untuk mengurai input. Ini akan melewati semua kode terkait validasi (karena Anda tidak memerlukan semua itu) dan akan sedikit lebih efisien.
Untuk bilangan bulat positif yang valid:
Untuk bilangan bulat positif dan negatif:
Jika Anda mengharapkan spasi putih sebelum atau setelah angka-angka ini, maka pastikan untuk melakukan
str = str.trim()
sebelum memproses lebih lanjut.sumber
Cukup Anda bisa mencoba ini:
Integer.parseInt(your_string);
untuk mengonversi aString
menjadiint
Double.parseDouble(your_string);
untuk mengonversi aString
menjadidouble
Contoh
sumber
Untuk string normal, Anda dapat menggunakan:
Untuk pembuat String dan buffer String Anda dapat menggunakan:
sumber
Pastikan tidak ada data non-numerik di string.
sumber
Saya sedikit terkejut bahwa tidak ada yang menyebutkan konstruktor Integer yang mengambil String sebagai parameter.
Jadi begini:
Java 8 - Integer (String) .
Tentu saja, konstruktor akan mengembalikan tipe
Integer
, dan operasi unboxing mengubah nilai menjadiint
.Penting untuk disebutkan : Konstruktor ini memanggil
parseInt
metode.sumber
Gunakan Integer.parseInt () dan letakkan di dalam
try...catch
blok untuk menangani kesalahan jika-kalau karakter non-numerik dimasukkan, misalnya,sumber
Kita mulai
sumber
Itu dapat dilakukan dengan tujuh cara:
1) Menggunakan
Ints.tryParse
:2) Menggunakan
NumberUtils.createInteger
:3) Menggunakan
NumberUtils.toInt
:4) Menggunakan
Integer.valueOf
:5) Menggunakan
Integer.parseInt
:6) Menggunakan
Integer.decode
:7) Menggunakan
Integer.parseUnsignedInt
:sumber
Salah satu metode adalah parseInt (String). Ia mengembalikan int primitif:
Metode kedua adalah valueOf (String), dan mengembalikan objek Integer () baru:
sumber
Anda dapat menggunakan salah satu dari yang berikut:
Integer.parseInt(s)
Integer.parseInt(s, radix)
Integer.parseInt(s, beginIndex, endIndex, radix)
Integer.parseUnsignedInt(s)
Integer.parseUnsignedInt(s, radix)
Integer.parseUnsignedInt(s, beginIndex, endIndex, radix)
Integer.valueOf(s)
Integer.valueOf(s, radix)
Integer.decode(s)
NumberUtils.toInt(s)
NumberUtils.toInt(s, defaultValue)
sumber
Ini adalah program lengkap dengan semua kondisi positif dan negatif tanpa menggunakan perpustakaan
sumber
Integer.parseInt
.