Bagaimana cara saya mengkonversi dari int ke String?

745

Saya sedang mengerjakan proyek di mana semua konversi dari intke Stringdilakukan seperti ini:

int i = 5;
String strI = "" + i;

Saya tidak terbiasa dengan Java.

Apakah ini latihan yang biasa atau ada yang salah, seperti yang saya duga?

Denis Palnitsky
sumber
47
Cara "konyol, mudah" adalah string = "" + integer;
Fattie
1
dokumen yang bagus: [ javarevisited.blogspot.de/2011/08/... contoh
Narayan Yerrabachu
2
Maksud saya, ini cara "cepat, sederhana" untuk melakukannya. ini agak konyol tapi berhasil!
Fattie
1
Seorang rekan saya melakukannya Integer.valueOf(i).toString(). Dia pasti menyukai benda. Meskipun sangat jelas menyatakan niatnya, itu agak lama untuk seleraku.
Ole VV
5
Anda hanya perlu 45 baris kode, dan menerapkan 7 antarmuka untuk melakukannya.
Ska

Jawaban:

958

Cara normal adalah Integer.toString(i)atau String.valueOf(i).

Rangkaian akan bekerja, tetapi tidak konvensional dan bisa menjadi bau yang buruk karena menunjukkan penulis tidak tahu tentang dua metode di atas (apa lagi yang mungkin mereka tidak tahu?).

Java memiliki dukungan khusus untuk operator + ketika digunakan dengan string (lihat dokumentasi ) yang menerjemahkan kode yang Anda kirim ke:

StringBuilder sb = new StringBuilder();
sb.append("");
sb.append(i);
String strI = sb.toString();

pada waktu kompilasi. Ini sedikit kurang efisien ( sb.append()akhirnya memanggil Integer.getChars(), yang memang Integer.toString()akan dilakukan), tetapi berhasil.

Untuk menjawab komentar Grodriguez: ** Tidak, kompiler tidak mengoptimalkan string kosong dalam kasus ini - lihat:

simon@lucifer:~$ cat TestClass.java
public class TestClass {
  public static void main(String[] args) {
    int i = 5;
    String strI = "" + i;
  }
}
simon@lucifer:~$ javac TestClass.java && javap -c TestClass
Compiled from "TestClass.java"
public class TestClass extends java.lang.Object{
public TestClass();
  Code:
   0:    aload_0
   1:    invokespecial    #1; //Method java/lang/Object."<init>":()V
   4:    return

public static void main(java.lang.String[]);
  Code:
   0:    iconst_5
   1:    istore_1

Menginisialisasi StringBuilder:

   2:    new    #2; //class java/lang/StringBuilder
   5:    dup
   6:    invokespecial    #3; //Method java/lang/StringBuilder."<init>":()V

Tambahkan string kosong:

   9:    ldc    #4; //String
   11:    invokevirtual    #5; //Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;

Tambahkan bilangan bulat:

   14:    iload_1
   15:    invokevirtual    #6; //Method java/lang/StringBuilder.append:
(I)Ljava/lang/StringBuilder;

Ekstrak string terakhir:

   18:    invokevirtual    #7; //Method java/lang/StringBuilder.toString:
()Ljava/lang/String;
   21:    astore_2
   22:    return
}

Ada proposal dan pekerjaan berkelanjutan untuk mengubah perilaku ini, ditargetkan untuk JDK 9.

SimonJ
sumber
9
bagaimana dengan jit compiler di jvm? :-) javac tidak melakukan optimasi mewah.
Peter Štibraný
5
Siapa tahu :) javac mengoptimalkan ekspresi semacam ini ketika literal numerik digunakan, meskipun (misalnya "" + 5menjadi "5").
SimonJ
5
Ya, tapi mengapa Anda melakukannya "" + 5bukan hanya "5"?
Grungondola
3
Bagus! +1 untuk apa lagi yang mungkin tidak mereka ketahui?
Sнаđошƒаӽ
2
The "" + integerPendekatan yang digunakan dalam salah satu tutorial oracle resmi .
Tomasz Nocoń
252

Itu bisa diterima, tetapi saya tidak pernah menulis hal seperti itu. Saya lebih suka ini:

String strI = Integer.toString(i);
Duffymo
sumber
101
Saya lebih suka pendekatan String.valueOf, karena Anda dapat menggunakan panggilan yang sama persis untuk semua jenis.
Jon Skeet
1
NumberFormatter akan menjadi pendekatan yang lebih baik
Kasturi
Jawaban yang bagus, Kasturi. Saya akan mempostingnya sebagai sesuatu yang lebih dari sekedar komentar.
duffymo
2
Maaf atas ketidaktahuan saya, tetapi tidakkah ini menggunakan budaya saat ini? Saya datang dari bentuk .NET latar belakang BTW.
Ε Г И І И О
3
Untuk integer, tidak ada hal khusus budaya yang digunakan secara default (tidak ada desimal atau pemisah ribuan sama sekali). Itu untuk apa NumberFormatter. Anda dapat menggunakan format seperti NumberFormat.getInstance(Locale.FRENCH).
Kat
111

Itu bukan cara yang baik.

Saat melakukan konversi dari int ke string, ini harus digunakan:

int i = 5;
String strI = String.valueOf(i);
darioo
sumber
7
1. Anda meminta string kosong; 2. Anda meminta penggabungan; 3. karena Anda tidak memiliki string, Anda akhirnya akan mengubah int Anda menjadi string. Solusi daridoo hindari langkah pertama.
Nicolas
tidak int ibisa kotak ke Integersebelum ditambahkan ke String strI?
Kevin Meredith
1
@ KevinMeredith, tidak, tidak. Anda sebenarnya menelepon StringBuilder.append(int)(dan StringBuildermemiliki appendmetode untuk semua tipe primitif).
Kat
60

Ini bukan hanya optimasi 1 . Saya tidak suka

"" + i

karena tidak mengungkapkan apa yang ingin saya lakukan 2 .

Saya tidak ingin menambahkan integer ke string (kosong). Saya ingin mengonversi integer ke string:

Integer.toString(i)

Atau, bukan pilihan saya, tetapi masih lebih baik daripada penggabungan, dapatkan representasi string dari objek (integer):

String.valueOf(i)

1. Untuk kode yang disebut sangat sering, seperti dalam loop, optimisasi tentu juga merupakan titik untuk tidak menggunakan penggabungan .

2. ini tidak berlaku untuk penggunaan rangkaian nyata seperti dalam System.out.println("Index: " + i); atau String id = "ID" + i;

pengguna85421
sumber
3
Orang-orang yang berbicara tentang kinerja dalam konteks ini adalah pengalih perhatian. Jauh, jauh, jauh, jauh, jauh, jauh lebih penting adalah keterbacaan .
Brian Goetz
23

Banyak mata kuliah pengantar Universitas tampaknya mengajarkan gaya ini, karena dua alasan (menurut pengalaman saya):

  • Itu tidak membutuhkan pemahaman tentang kelas atau metode. Biasanya, ini diajarkan jauh sebelum kata "kelas" pernah disebutkan - atau bahkan metode panggilan. Jadi menggunakan sesuatu seperti String.valueOf(…)akan membingungkan siswa.

  • Ini adalah sebuah ilustrasi dari “operator overloading” - pada kenyataannya, ini dijual kepada kita sebagai para operator yang kelebihan beban idiomatik (heran kecil di sini, karena Jawa tidak memungkinkan operator overloading kustom).

Jadi itu bisa lahir dari kebutuhan didaktik (walaupun saya berpendapat bahwa ini hanya pengajaran yang buruk) atau digunakan untuk menggambarkan sebuah prinsip yang sebaliknya cukup sulit untuk ditunjukkan di Jawa.

Konrad Rudolph
sumber
2
saya pikir sebaliknya konstruksi seperti "" + saya akan membingungkan pemula. Dan juga itu adalah gaya yang buruk selama sisa hidup mereka.
Konstantin Zyubin
15

Ekspresi

"" + i

mengarah ke string konversi dari isaat runtime. Jenis keseluruhan ekspresi adalah String. ipertama kali dikonversi ke Integerobjek ( new Integer(i)), kemudian String.valueOf(Object obj)dipanggil. Jadi itu setara dengan

"" + String.valueOf(new Integer(i));

Jelas, ini sedikit kurang berkinerja daripada hanya menelepon String.valueOf(new Integer(i))yang akan menghasilkan hasil yang sama.

Keuntungan dari ""+imengetik adalah lebih mudah / lebih cepat dan beberapa orang mungkin berpikir, bahwa itu lebih mudah dibaca. Ini bukan bau kode karena tidak menunjukkan masalah yang lebih dalam.

(Referensi: JLS 15.8.1 )

Andreas Dolk
sumber
3
Pernyataan "setara" Anda tidak setara. Bahkan jika memanggil String.valueOftinju yang diperlukan i(tidak, karena ada kelebihan yang menerima int), itu tidak akan digunakan new Integer(i), itu akan digunakan Integer.valueOf(i). Tapi itu benar-benar tidak melakukan semua ini. Ya new StringBuilder().append("").append(i).toString(), seperti yang dicatat oleh SimonJ. StringBuilder memiliki logikanya sendiri untuk mengubah int primitif imenjadi sebuah String.
Mark Peters
4
Bagian tentang bau kode itu benar; kode bau adalah istilah yang salah di sini. Jadi saya akan melepas downvote.
Mark Peters
Tampaknya tidak efisien untuk melakukannya dengan "" + i. Sangat disarankan Integer.toString atau String.valueOf. Lihat javadevnotes.com/java-integer-to-string-examples
JavaDev
14

Secara pribadi, saya tidak melihat hal buruk dalam kode ini.

Ini cukup berguna ketika Anda ingin mencatat nilai int, dan logger hanya menerima sebuah string. Saya akan mengatakan konversi seperti itu nyaman ketika Anda perlu memanggil metode menerima String, tetapi Anda memiliki nilai int.

Adapun pilihan antara Integer.toStringatau String.valueOf, itu semua masalah selera.
... Dan secara internal, String.valueOfpanggilan Integer.toStringmetode dengan cara. :)

ksu
sumber
12

Cara lain yang saya sadari adalah dari Integerkelas:

Integer.toString(int n);
Integer.toString(int n, int radix);

Contoh nyata (meskipun saya tidak berpikir Anda membutuhkan):

String five = Integer.toString(5); // returns "5"

Ini juga berfungsi untuk jenis primitif lainnya, misalnya Double.toString.

Lihat di sini untuk detail lebih lanjut.

zneak
sumber
9

Teknik ini diajarkan di pengantar tingkat sarjana ke Jawa yang saya ikuti lebih dari satu dekade yang lalu. Namun, saya harus mencatat bahwa, IIRC, kami belum sampai ke metode kelas String dan Integer.

Tekniknya sederhana dan cepat untuk mengetik. Jika semua yang saya lakukan adalah mencetak sesuatu, saya akan menggunakannya (misalnya System.out.println("" + i);,. Namun, saya pikir itu bukan cara terbaik untuk melakukan konversi, karena perlu berpikir sejenak untuk menyadari apa yang terjadi ketika sedang digunakan dengan cara ini.Juga, jika kinerja menjadi perhatian, tampaknya lebih lambat (lebih banyak di bawah, dan juga dalam jawaban lain).

Secara pribadi, saya lebih suka Integer.toString (), karena sudah jelas apa yang terjadi. String.valueOf () akan menjadi pilihan kedua saya, karena tampaknya membingungkan (saksikan komentar setelah jawaban darioo).

Hanya untuk nyengir :) Saya menulis kelas untuk menguji tiga teknik: "" + i, Integer.toString, dan String.ValueOf. Setiap tes baru saja mengkonversi int dari 1 ke 10.000 ke Strings. Saya kemudian menjalankan masing-masing melalui perintah waktu Linux lima kali. Integer.toString () sedikit lebih cepat dari String.valueOf () sekali, mereka terikat tiga kali, dan String.valueOf () lebih cepat sekali; Namun, perbedaannya tidak lebih dari beberapa milidetik.

Teknik "" + i lebih lambat dari keduanya pada setiap tes kecuali satu, ketika itu 1 milidetik lebih cepat dari Integer.toString () dan 1 milidetik lebih lambat dari String.valueOf () (jelas pada tes yang sama di mana String.valueOf () lebih cepat dari Integer.toString ()). Meskipun biasanya hanya beberapa milidetik lebih lambat, ada satu tes di mana itu sekitar 50 milidetik lebih lambat. YMMV .

GreenMatt
sumber
1
Jangan lupa untuk memperhitungkan JIT - beberapa konversi pertama akan jauh lebih lambat dan mengubah waktu. Di MacBook saya, penggabungan membutuhkan ~ 20ns lebih lama dari dua metode lainnya (yang keduanya mengambil ~ 50ns per konversi), sehingga perbedaan yang Anda lihat dalam urutan ms mungkin disebabkan oleh kesalahan acak (penjadwalan, interupsi, dll).
SimonJ
6

Ada berbagai cara mengonversi ke Strings:

StringBuilder string = string.append(i).toString();
String string = String.valueOf(i);
String string = Integer.toString(i);
Shailej Shimpi
sumber
StringBuilder string = string.append (i) .toString (); ... Hm, jadi apakah itu StringBuilder, atau sebuah String? Berantakan di sini ...
Franta
6

Itu tergantung pada bagaimana Anda ingin menggunakan String Anda. Ini dapat membantu:

String total =  Integer.toString(123) + Double.toString(456.789);
Niyuhire Justine
sumber
5

Kebanyakan ditto pada SimonJ. Saya sangat tidak suka idiom + "" saya. Jika Anda mengatakan String.valueOf (i), Java mengubah integer menjadi string dan mengembalikan hasilnya. Jika Anda mengatakan "" + i, Java membuat objek StringBuilder, menambahkan string kosong ke dalamnya, mengubah integer menjadi string, menambahkan ini ke StringBuilder, lalu mengonversi StringBuilder ke String. Itu banyak langkah ekstra. Saya kira jika Anda melakukannya sekali dalam program besar, itu bukan masalah besar. Tetapi jika Anda melakukan ini sepanjang waktu, Anda membuat komputer melakukan banyak pekerjaan tambahan dan membuat semua objek tambahan ini yang kemudian harus dibersihkan. Saya tidak ingin menjadi fanatik tentang optimasi mikro, tetapi saya tidak ingin sia-sia sia-sia juga.

Jay
sumber
5
String strI = String.valueOf(i);

String string = Integer.toString(i);

Kedua cara itu benar.

Shailej Shimpi
sumber
5

Ada banyak cara untuk mengonversi bilangan bulat menjadi string:

1)

Integer.toString(10);

2)

 String hundred = String.valueOf(100); // You can pass an int constant
 int ten = 10;
 String ten = String.valueOf(ten)

3)

String thousand = "" + 1000; // String concatenation

4)

String million = String.format("%d", 1000000)
Hoque MD Zahidul
sumber
1
String.format ("% d", 1000000) ... Ini bukan benar-benar Int >> Konversi string, ini agak String >> String memproses di sini, meskipun kelebihan beban. Jadi saya tidak merekomendasikan ini. Jelas bukan untuk tujuan konversi saja.
Franta
5

Ada tiga cara konversi ke Strings

  1. String string = "" + i;
  2. String string = String.valueOf(i);
  3. String string = Integer.toString(i);
Vihaan Verma
sumber
1
Anda lupa: String.format("%d", i).
Brian Goetz
3

Menggunakan "" + i adalah cara terpendek dan termudah untuk mengubah angka menjadi string. Ini bukan yang paling efisien, tetapi itu adalah IMHO paling jelas dan itu biasanya lebih penting. Semakin sederhana kodenya, semakin kecil kemungkinan Anda melakukan kesalahan.

Peter Lawrey
sumber
2
Bagaimana orang membuat kesalahan dalam memanggil String.valueOf atau Integer.toString?
Eva
1
Saya telah menemukan beberapa penggunaan String.valueOf () yang tidak ideal tapi saya tidak dapat mengingatnya sekarang. Sementara hasilnya benar, itu kurang efisien daripada""+i
Peter Lawrey
2

Secara pribadi saya berpikir bahwa "" + saya memang terlihat sebagai poster pertanyaan asli menyatakan "bau". Saya telah menggunakan banyak bahasa OO selain Java. Jika sintaks itu dimaksudkan tepat maka Java hanya akan menginterpretasikan saya sendiri tanpa membutuhkan "" yang diinginkan untuk dikonversi ke string dan melakukannya karena tipe tujuan tidak ambigu dan hanya satu nilai tunggal akan diberikan di sebelah kanan. . Yang lain tampak seperti 'trik' untuk mengelabui kompiler, mojo buruk ketika versi Javac berbeda yang dibuat oleh produsen lain atau dari platform lain dipertimbangkan jika kode perlu porting. Heck untuk uang saya itu harus seperti banyak OOL lainnya saja ambil Typecast: (String) I. mengedipkan mata

Mengingat cara saya belajar dan untuk kemudahan memahami konstruksi seperti itu ketika membaca kode orang lain dengan cepat saya memilih metode Integer.toString (i). Melupakan satu atau dua dalam bagaimana Java mengimplementasikan hal-hal di latar belakang vs. String.valueOf (i) metode ini terasa benar bagi saya dan mengatakan dengan tepat apa yang terjadi: Saya memiliki dan Integer dan saya berharap itu dikonversi menjadi String.

Poin bagus yang dibuat beberapa kali mungkin hanya menggunakan StringBuilder di muka adalah jawaban yang baik untuk membangun String yang dicampur teks dan int atau objek lain karena itu yang akan digunakan di latar belakang, kan?

Hanya dua sen saya dilemparkan ke kucing jawaban yang sudah dibayar dari jawaban untuk pertanyaan Mans ... tersenyum

EDIT KE JAWABAN SAYA SENDIRI SETELAH BEBERAPA PERUBAHAN

Ok, Ok, saya memikirkan ini lagi dan String.valueOf (i) juga sangat bagus, katanya: Saya ingin sebuah String yang mewakili nilai Integer. lol, Bahasa Inggris jauh lebih sulit diurai daripada Jawa! Tapi, saya meninggalkan sisa jawaban / komentar saya ... Saya selalu diajarkan untuk menggunakan level terendah dari metode / fungsi rantai jika memungkinkan dan masih mempertahankan keterbacaan jadi jika String.valueOf memanggil Integer.toString lalu Mengapa menggunakan oranye utuh jika Anda hanya akan mengupasnya, Hmmm?

Untuk mengklarifikasi komentar saya tentang StringBuilder, saya membangun banyak string dengan kombo yang sebagian besar teks dan int literal dan mereka akhirnya menjadi panjang dan jelek dengan panggilan ke rutinitas yang disebutkan di atas tertanam di antara +, jadi menurut saya jika itu menjadi SB objek anyways dan metode append memiliki kelebihan mungkin lebih bersih untuk terus maju dan menggunakannya ... Jadi saya kira saya hingga 5 sen yang satu ini sekarang, eh? lol ...

David
sumber
-1

menggunakan Integer.toString(tmpInt).trim();

Karan Chunara
sumber
Sebenarnya tidak ada situasi di mana trim()akan ada gunanya di sini.
Dorian Grey
-5

Coba tipecast sederhana

char c = (char) i;
Bilal Haider
sumber
3
Ini bukan cara yang baik untuk mengubah int menjadi string. Sebenarnya, Anda tidak mengonversi int menjadi string, Anda mengonversi int menjadi char. Ini akan menafsirkan int sebagai kode karakter ASCII dan memberi Anda karakter itu. Ini berbahaya (nilai negatif, dll.) Dan secara keseluruhan salah.
Nepoxx
Harap hapus pertanyaan di atas, char dan String keduanya berbeda ...!
tapi ini berhasil (ASCII charset "offset"):char c = (char) (i + 48);
electrobabe