C# tidak pernah mengonversi antartipe yang tidak berhubungan dengan sendirinya. String yang berisi angka tetaplah string, dan double tidak diam-diam berubah menjadi int. Kamu melakukan konversi secara eksplisit, dan alat yang dipakai tergantung pada apa yang dikonversi: teks ke angka (parsing), satu tipe numerik ke tipe numerik lain (casting), atau objek ke tipe yang lebih spesifik (as, is).
String ke int: Parse, TryParse, dan Convert
Ada tiga cara standar untuk mengubah teks menjadi int:
Output:
2500
TryParse ok: 1250
TryParse failed, d = 0
42
-17
int.TryParse mengembalikan bool dan menulis hasilnya ke variabel out, yang diisi 0 kalau gagal. Karena input yang salah itu normal untuk apa pun yang diketik pengguna, TryParse adalah pilihan default untuk input, file dan query string. Method yang sama tersedia di setiap tipe numerik: long.TryParse, double.TryParse, decimal.Parse, dan seterusnya.
Apa yang dilakukan masing-masing pada input yang salah
Ketiga method itu hanya berbeda dalam cara gagalnya:
Output:
int.Parse(null) throws ArgumentNullException
Convert.ToInt32(null) = 0
int.Parse("abc") throws FormatException
int.Parse("12.5") throws FormatException
int.Parse("1,000") throws FormatException
int.Parse("9999999999") throws OverflowException
int.Parse("") throws FormatException
FormatException membawa pesan yang sudah akrab, "Input string was not in a correct format" (di .NET 8 dan sesudahnya, "The input string '12.5' was not in a correct format", dengan teks yang dikutip), dan ini adalah salah satu error runtime C# yang paling umum: "12.5" bukan int, begitu juga "1,000". Untuk menerimanya, parse sebagai decimal, atau beri tahu parser gaya apa saja yang diizinkan:
Output:
1000
255
13
10
Culture: kenapa "1.5" bisa menjadi 15
Secara default, parsing memakai culture saat ini, dan setiap culture punya aturan pemisah yang berbeda. Di culture Jerman dan beberapa culture Eropa lain, pemisah desimalnya adalah koma dan titik dipakai untuk mengelompokkan ribuan. String yang sama menghasilkan angka yang berbeda:
Output:
1.5
15
1.5
Kode yang membaca file data, JSON, konfigurasi atau apa pun yang dibuat mesin sebaiknya selalu mengirim CultureInfo.InvariantCulture, baik saat parsing maupun saat memformat. Kalau tidak, program yang sama berjalan baik di komputer developer tetapi salah membaca setiap angka di server yang diatur ke bahasa lain. Pakai culture saat ini hanya untuk teks yang diketik atau akan dibaca manusia.
Konversi numerik implisit dan eksplisit
Konversi pelebaran terjadi secara implisit: int ke long, int ke double, float ke double, int ke decimal. Konversi yang bisa menghilangkan besaran nilai atau bagian pecahannya butuh cast eksplisit (type)value. Satu pengecualian yang perlu diingat: int atau long ke float, dan long ke double, bersifat implisit walaupun bisa kehilangan presisi: float f = 16_777_217; bisa dikompilasi dan menyimpan 16777216.
Output:
9 -9
10
2
4
705032704
9.99
7 7.0 7
Ada tiga hal yang perlu diingat. Cast dari floating point ke integer memotong; cast tidak membulatkan. Convert.ToInt32(double) membulatkan, dengan banker's rounding (nilai tengah ke tetangga yang genap). Dan cast integer yang tidak muat akan berputar balik tanpa peringatan, kecuali dijalankan di konteks checked, yang melempar OverflowException (lihat tipe data).
int x = 3.7; adalah error kompilasi (CS0266: cannot implicitly convert type 'double' to 'int', an explicit conversion exists), yaitu compiler yang memintamu memilih antara cast dan method pembulatan.
Angka dan tipe lain ke string
Setiap tipe punya ToString(), dan tipe numerik menerima format string. Interpolasi string memanggil pemformatan yang sama:
Output:
42
000042
1234.50
1,234.50
$1,234.50
FF
1010
True
Order 000042: 1234.50
Kode format (D, F, N, C, X, P, E) dan pola kustom seperti "0.00" dibahas di interpolasi string.
Karakter dan boolean
Output:
7
55
7
7
A
True
False
1
False
(int)'7' bernilai 55, yaitu kode karakternya, bukan 7. Ini sering menjebak siapa pun yang menjumlahkan digit sebuah angka; kurangkan dengan '0' atau pakai char.GetNumericValue. bool.Parse menerima "true" dan "false" dengan huruf besar atau kecil, dan tidak menerima yang lain ("yes" dan "1" melempar exception).
Konversi reference: cast, as, dan is
Untuk tipe class, cast memeriksa tipe asli objek saat program berjalan. Upcast ke base class bersifat implisit. Downcast ke class turunan butuh cast eksplisit, yang melempar InvalidCastException saat objeknya ternyata tipe lain:
Output:
4242
True
Card ending 4242, 50.00
InvalidCastException
5
cannot unbox int as long
Utamakan is dengan variabel saat kamu perlu bercabang berdasarkan tipe; itu hanya satu pemeriksaan, tidak bisa melempar exception, dan variabel barunya hanya berlaku di bagian tempat pengujian berhasil. Pakai cast biasa saat tipe yang berbeda berarti bug yang harus gagal dengan jelas. Kasus int yang di-box sering menjebak orang yang membaca angka dari collection object atau sel DataRow: lakukan unbox ke tipe yang persis sama dulu ((long)(int)boxed), atau pakai Convert.ToInt64(boxed), yang bisa menangani tipe numerik apa pun.
Pertanyaan yang sering diajukan
Bagaimana cara mengonversi string ke int di C#?
Pakai int.TryParse(text, out int number) saat teksnya berasal dari pengguna, file atau jaringan: method ini mengembalikan false alih-alih melempar exception saat teksnya bukan angka yang valid. Pakai int.Parse(text) saat teks yang tidak valid berarti ada bug dan exception adalah respons yang tepat. Convert.ToInt32(text) berperilaku seperti int.Parse, hanya saja mengembalikan 0 untuk null.
Apa bedanya int.Parse dan Convert.ToInt32?
Untuk string, keduanya hampir sama: keduanya melempar FormatException untuk teks seperti "abc" dan OverflowException untuk angka di luar rentang. Bedanya ada di null: int.Parse(null) melempar ArgumentNullException, sedangkan Convert.ToInt32(null) mengembalikan 0. Convert.ToInt32 juga menerima tipe lain (double, bool, object), dan membulatkan double ke bilangan bulat genap terdekat alih-alih memotongnya.
Apa arti "Input string was not in a correct format"?
Ini adalah pesan FormatException yang dilempar oleh int.Parse, double.Parse atau Convert.ToInt32 (di .NET 8 dan sesudahnya bunyinya "The input string 'abc' was not in a correct format", dengan teks yang dikutip) saat teksnya bukan angka dalam format yang diharapkan: huruf, string kosong, titik desimal saat mem-parse int, atau pemisah ribuan. Beralihlah ke TryParse untuk menangani input yang salah tanpa exception, dan periksa dalam culture apa angka itu ditulis.
Bagaimana cara cast double ke int di C#?
Tulis cast eksplisit: int n = (int)price;. Cast ini memotong ke arah nol, jadi (int)9.99 menjadi 9 dan (int)-9.99 menjadi -9. Untuk membulatkan, pakai (int)Math.Round(price), dan ingat bahwa secara default Math.Round membulatkan nilai tengah ke bilangan genap terdekat; kirim MidpointRounding.AwayFromZero untuk pembulatan seperti yang diajarkan di sekolah.
Apa bedanya as dan cast di C#?
Cast (Dog)animal melempar InvalidCastException kalau objeknya bukan Dog. animal as Dog mengembalikan null sebagai gantinya, jadi harus diikuti pemeriksaan null, dan hanya berlaku untuk reference type dan nullable type. Alternatif modernnya adalah pola is: if (animal is Dog dog) { ... } menguji dan mengonversi dalam satu langkah.