String interpolation membangun string dari teks literal dan ekspresi. Beri awalan $ pada literal-nya, taruh ekspresi C# apa pun di dalam kurung kurawal, lalu nilainya diubah menjadi teks dan disisipkan:
Output:
Hello, Maya!
3 items at 4.5 = 13.5
Name has 4 letters, upper: MAYA
Free shipping: yes
Interpolation hadir di C# 6. Compiler mengubahnya menjadi pemanggilan string.Format atau string.Concat (atau, sejak C# 10, menjadi kode handler yang lebih efisien), jadi cara ini tidak lebih lambat daripada membangun string secara manual.
Ekspresi kondisional di baris terakhir butuh tanda kurung. Di dalam lubang interpolation, titik dua memulai format specifier, jadi {x > 10 ? "yes" : "no"} tanpa tanda kurung adalah error kompilasi.
Format specifier
Setelah ekspresi, titik dua dan sebuah string format mengatur cara nilainya ditulis. String format yang sama bisa dipakai dengan ToString("...") dan string.Format.
Output:
1234567.89
1,234,567.89
1,234,568
00042
FF
00ff
1.23E+006
0.813
81.3%
1,234,567.89
007.5
3.1
Kode standar, masing-masing bisa diikuti angka presisi:
| Kode | Nama | Contoh | Hasil |
|---|---|---|---|
F atau F2 | Fixed-point | {3.14159:F2} | 3.14 |
N atau N0 | Angka dengan pemisah kelompok | {1234.56:N0} | 1,235 |
C | Mata uang (simbol dan pola milik culture) | {9.5:C} di en-US | $9.50 |
D5 | Bilangan bulat yang diisi nol | {42:D5} | 00042 |
X, x | Heksadesimal | {255:X} | FF |
E2 | Notasi ilmiah | {1234.5:E2} | 1.23E+003 |
P1 | Persen (dikali 100) | {0.256:P1} di en-US | 25.6% |
G | Umum (terpendek) | {2.50m:G} | 2.50 |
R | Round-trip (double) | {0.1:R} | 0.1 |
Pola kustom menyusun format dari placeholder: 0 adalah digit yang selalu ditampilkan, # adalah digit yang hanya ditampilkan jika signifikan, . adalah titik desimal, , di dalam angka mengaktifkan pemisah kelompok, dan % mengalikan dengan 100. "0.##" menampilkan sampai dua angka desimal dan membuang nol di belakang; "#,##0.00" adalah format akuntansi klasik.
Semua pemformatan angka membulatkan nilai yang ditampilkan; variabelnya sendiri tidak berubah. Jika sebuah nilai tepat di tengah (2,25 yang ditampilkan dengan satu desimal), runtime dan tipe yang berbeda bisa membulatkannya secara berbeda, jadi jika aturan pembulatan itu penting, bulatkan dulu secara eksplisit dengan Math.Round(value, 1, MidpointRounding.AwayFromZero), lalu format.
Tanggal di dalam interpolation
Nilai DateTime menerima string format tanggal dengan cara yang sama:
Output:
2026-09-24
24/09/2026 16:05
Thu, Sep 24
Shipped at 16:05 on Thursday
ETA 02:10
2.2 hours
Format kustom TimeSpan mengharuskan karakter literal diberi escape dengan backslash, yang di string literal biasa ditulis \\:. Daftar lengkap kode tanggal (yyyy, MM, HH, tt...) dan kesalahan yang sering dibuat orang (mm adalah menit, MM adalah bulan) ada di Format DateTime.
Alignment dan padding
Koma setelah ekspresi menentukan lebar minimum kolom. Angka positif membuat rata kanan, angka negatif membuat rata kiri. Jika digabung dengan format, cara ini bisa merapikan tabel dalam teks biasa:
Output:
Item | Price| Sold
----------------------------
Espresso | 2.40| 118
Latte | 3.60| 64
Hot chocolate | 4.25| 9
Sintaksnya adalah {expression,alignment:format}: alignment lebih dulu, lalu format. Nilai yang lebih panjang dari lebarnya tidak dipotong; ia mendorong sisa barisnya ke kanan. PadLeft dan PadRight melakukan padding yang sama di luar interpolation.
Escape kurung kurawal
Untuk mencetak kurung kurawal apa adanya, gandakan: {{ dan }}. Ini sering dibutuhkan saat output-nya berupa JSON, CSS, atau kode:
Output:
{ "id": 42, "name": "Ana" }
Set literal: {1, 2, 3}
{42}
Membangun JSON secara manual seperti ini tidak masalah untuk satu baris log singkat; untuk JSON sungguhan, pakai serializer, yang menangani tanda kutip dan karakter khusus di dalam name dengan benar.
string.Format dan composite formatting
Sebelum C# 6, pemformatan dilakukan dengan string.Format, yang menerima placeholder bernomor dan daftar argumen. Sintaks composite format yang sama juga diterima oleh Console.WriteLine, StringBuilder.AppendFormat, dan TextWriter.Write:
Output:
Notebook x4: 14.00
Notebook | 3.50
echo echo !
Dear Leo, your order #000731 has shipped.
Di dalam kode, lebih baik pakai interpolation: nilainya berada tepat di tempat munculnya, jadi placeholder tidak mungkin menunjuk argumen yang salah. string.Format tetap menjadi alat yang tepat jika template-nya berupa data, seperti pesan terjemahan yang dimuat dari file resource. Indeks placeholder yang tidak punya argumen pasangannya ({2} dengan dua argumen) melempar FormatException saat program berjalan.
Culture: mengatur pemisah dan mata uang
Interpolation, ToString, dan string.Format secara default memakai culture yang sedang aktif di thread itu. Di komputer yang diatur ke bahasa Jerman, {1234.5:N2} menghasilkan 1.234,50; di Amerika Serikat hasilnya 1,234.50. Format mata uang C memakai simbol milik culture tersebut. Untuk memilih culture secara eksplisit, simpan interpolated string sebagai FormattableString lalu format dengan sebuah provider:
Output:
Total: 1,234.50
Total: 1.234,50
$1,234.50
1.234,50
1234.5,0.75
Pakai culture milik pengguna untuk teks yang dibaca orang, dan CultureInfo.InvariantCulture untuk apa pun yang dibaca program lain. File CSV yang ditulis dengan culture aktif di komputer berbahasa Jerman punya koma di dalam angka dan tidak bisa dibaca di tempat lain. Di .NET 6 dan sesudahnya, string.Create(CultureInfo.InvariantCulture, $"...") melakukan hal yang sama dengan FormattableString.Invariant tanpa object perantara.
Interpolated string verbatim dan raw
$ bisa digabung dengan @ untuk interpolated string verbatim: backslash dianggap literal dan string-nya boleh terdiri dari beberapa baris. C# 8 dan sesudahnya menerima urutan mana pun ($@ atau @$); C# 6 dan 7 mewajibkan $@:
Output:
C:\Users\ana\Reports\2026\summary.txt
Report for ana
Year: 2026
C# 11 menambahkan raw interpolated string. Dengan satu $, kurung kurawal menandai ekspresi seperti biasa. Dengan $$, kurung kurawal tunggal dianggap literal dan ekspresi butuh dua kurung kurawal, sehingga template JSON dan kode jadi mudah dibaca:
// C# 11 and later
int id = 42;
string name = "Ana";
string json = $$"""
{
"id": {{id}},
"name": "{{name}}"
}
""";
C# 11 juga mengizinkan baris baru di dalam lubang interpolation, jadi ekspresi yang panjang atau ekspresi switch bisa dipecah menjadi beberapa baris.
Kesalahan umum
- Lupa menulis
$."Total: {total}"mencetak kurung kurawalnya apa adanya. Compiler tidak memberi peringatan. - Operator ternary tanpa tanda kurung di dalam kurung kurawal: titik duanya dibaca sebagai pemisah format.
- Memformat output yang dibaca mesin dengan culture yang sedang aktif. Koma desimal merusak CSV, JSON, dan SQL. Pakai invariant culture.
- Memakai
ToString()tanpa format untuk uang.2.5mdicetak sebagai2.5, bukan2.50. PakaiF2,N2, atauC. - Membangun string besar dengan interpolation di dalam perulangan. Setiap iterasi membuat string baru; pakai StringBuilder atau
string.Join.
Pertanyaan yang sering diajukan
Apa itu string interpolation di C#?
String literal yang diawali $, tempat ekspresi di dalam kurung kurawal dievaluasi lalu disisipkan: $"Total: {price * qty}". Fitur ini ditambahkan di C# 6 dan menggantikan sebagian besar pemakaian string.Format dan penggabungan dengan +. Ekspresi apa pun bisa ditaruh di dalam kurung kurawal, termasuk pemanggilan method dan akses property.
Bagaimana cara memformat angka menjadi 2 angka desimal di C#?
Tambahkan format specifier setelah titik dua: $"{price:F2}" mencetak 2 digit setelah titik desimal, dan $"{price:N2}" melakukan hal yang sama dengan pemisah ribuan. Di luar interpolation, kode yang sama bisa dipakai dengan price.ToString("F2"). Keduanya membulatkan nilai untuk ditampilkan tanpa mengubah nilainya.
Bagaimana cara melakukan escape kurung kurawal di interpolated string C#?
Gandakan: {{ mencetak { dan }} mencetak }. Misalnya $"{{ \"id\": {id} }}" mencetak { "id": 42 }. Di raw interpolated string C# 11, kamu bisa memulai literal dengan $$ sehingga kurung kurawal tunggal dianggap literal dan {{expr}} menandai ekspresi.
Apa perbedaan string.Format dan string interpolation?
Keduanya menghasilkan hasil yang sama dengan kode format yang sama. string.Format("{0} costs {1:F2}", name, price) merujuk ke argumen berdasarkan posisinya; $"{name} costs {price:F2}" menaruh ekspresinya langsung di dalam teks, sehingga lebih mudah dibaca dan tidak mungkin salah urutan argumen. string.Format tetap dibutuhkan jika string formatnya sendiri berasal dari file resource atau database.
Kenapa angka di interpolated string-ku memakai koma, bukan titik?
Interpolation memformat dengan culture yang sedang aktif di thread itu, dan banyak culture memakai koma sebagai pemisah desimal. Untuk output yang dibaca mesin (file, JSON, URL), format dengan invariant culture: FormattableString.Invariant($"{value:F2}"), atau di .NET 6 dan sesudahnya string.Create(CultureInfo.InvariantCulture, $"...").