Menu

C# String Interpolation ve String.Format: Biçim Belirteçleri, Hizalama, Kültür

C#'ta $"..." string interpolation nasıl çalışır: süslü parantez içindeki ifadeler, F2, N0, C, D5 ve X gibi biçim belirteçleri, tablolar için hizalama, süslü parantezleri kaçırmak, string.Format ve bileşik biçimlendirme, verbatim ve ham interpolated string'ler ve belirli bir kültür için biçimlendirme.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

String interpolation, literal metinden ve ifadelerden bir string oluşturur. Literal'in önüne $ koyun, herhangi bir C# ifadesini süslü parantez içine yazın; değeri metne çevrilip yerleştirilir:

Çıktı:

Hello, Maya!
3 items at 4.5 = 13.5
Name has 4 letters, upper: MAYA
Free shipping: yes

Interpolation C# 6 ile geldi. Derleyici onu bir string.Format ya da string.Concat çağrısına (C# 10'dan beri daha verimli handler koduna) çevirir, bu yüzden string'i elle oluşturmaktan daha yavaş değildir.

Son satırdaki koşullu ifade parantez gerektirir. Bir interpolation boşluğunun içinde iki nokta bir biçim belirtecini başlatır, bu yüzden parantezsiz {x > 10 ? "yes" : "no"} bir derleme hatasıdır.

Biçim belirteçleri

İfadeden sonra iki nokta ve bir biçim string'i değerin nasıl yazılacağını kontrol eder. Aynı biçim string'leri ToString("...") ve string.Format ile de çalışır.

Çıktı:

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

Standart kodlar; her birinin ardından isteğe bağlı bir hassasiyet sayısı gelebilir:

KodAdıÖrnekSonuç
F ya da F2Sabit nokta{3.14159:F2}3.14
N ya da N0Grup ayırıcılı sayı{1234.56:N0}1,235
CPara birimi (kültürün sembolü ve deseni)en-US'de {9.5:C}$9.50
D5Sıfırlarla doldurulmuş tamsayı{42:D5}00042
X, xOnaltılık{255:X}FF
E2Bilimsel{1234.5:E2}1.23E+003
P1Yüzde (100 ile çarpar)en-US'de {0.256:P1}25.6%
GGenel (en kısa){2.50m:G}2.50
RGidiş dönüş (double){0.1:R}0.1

Özel desenler yer tutuculardan bir biçim oluşturur: 0 her zaman gösterilen bir basamaktır, # yalnızca anlamlıysa gösterilen bir basamaktır, . ondalık noktadır, sayının içindeki , grup ayırıcılarını açar ve % 100 ile çarpar. "0.##" en fazla iki ondalık gösterir ve sondaki sıfırları atar; "#,##0.00" klasik muhasebe biçimidir.

Tüm sayısal biçimlendirme gösterilen değeri yuvarlar; değişkenin kendisi değişmez. Bir değer tam ortadayken (2.25'in tek ondalıkla gösterilmesi), farklı çalışma zamanları ve tipler eşitliği farklı yuvarlayabilir; kural önemliyse önce Math.Round(value, 1, MidpointRounding.AwayFromZero) ile açıkça yuvarlayın, sonra biçimlendirin.

Interpolation'da tarihler

DateTime değerleri tarih biçim string'lerini aynı şekilde alır:

Çıktı:

2026-09-24
24/09/2026 16:05
Thu, Sep 24
Shipped at 16:05 on Thursday
ETA 02:10
2.2 hours

Bir TimeSpan özel biçimi, literal karakterlerin ters eğik çizgiyle kaçırılmasını gerektirir; bu, normal bir string literal'inde \\: olarak yazılır. Tarih kodlarının tam listesi (yyyy, MM, HH, tt...) ve onlarla yapılan hatalar (mm dakika, MM aydır) DateTime format sayfasındadır.

Hizalama ve doldurma

İfadeden sonraki bir virgül en küçük alan genişliğini belirler. Pozitif bir sayı sağa, negatif bir sayı sola hizalar. Bir biçimle birleştiğinde düz metinde tabloları hizalar:

Çıktı:

Item          |  Price| Sold
----------------------------
Espresso      |   2.40|  118
Latte         |   3.60|   64
Hot chocolate |   4.25|    9

Sözdizimi {expression,alignment:format} şeklindedir: önce hizalama, sonra biçim. Genişlikten uzun bir değer kırpılmaz; satırın geri kalanını iter. PadLeft ve PadRight, interpolation dışında aynı doldurmayı yapar.

Süslü parantezleri kaçırmak

Literal bir süslü parantez yazdırmak için onu ikiye katlayın: {{ ve }}. Çıktı JSON, CSS ya da kod olduğunda bu gerekir:

Çıktı:

{ "id": 42, "name": "Ana" }
Set literal: {1, 2, 3}
{42}

JSON'u böyle elle oluşturmak hızlı bir log satırı için sorun değildir; gerçek JSON için name içindeki tırnakları ve özel karakterleri doğru ele alan bir serializer kullanın.

string.Format ve bileşik biçimlendirme

C# 6'dan önce biçimlendirme, numaralı yer tutucular ve bir argüman listesi alan string.Format ile yapılırdı. Aynı bileşik biçim sözdizimini Console.WriteLine, StringBuilder.AppendFormat ve TextWriter.Write de kabul eder:

Çıktı:

Notebook x4: 14.00
Notebook  |  3.50
echo echo !
Dear Leo, your order #000731 has shipped.

Kodda interpolation'ı tercih edin: değerler göründükleri yerde durur, bu yüzden bir yer tutucu yanlış argümanı gösteremez. Şablon veri olduğunda, örneğin bir kaynak dosyasından yüklenen çevrilmiş bir mesajda, doğru araç hâlâ string.Format'tır. Eşleşen argümanı olmayan bir yer tutucu indeksi (iki argümanla {2}) çalışma zamanında bir FormatException fırlatır.

Kültür: ayırıcıları ve para birimini kontrol etmek

Interpolation, ToString ve string.Format varsayılan olarak thread'in geçerli kültürünü kullanır. Almancaya ayarlı bir makinede {1234.5:N2} 1.234,50 üretir; ABD'de 1,234.50 üretir. C para birimi biçimi kültürün sembolünü kullanır. Kültürü açıkça seçmek için interpolated string'i bir FormattableString olarak yakalayın ve bir sağlayıcıyla biçimlendirin:

Çıktı:

Total: 1,234.50
Total: 1.234,50
$1,234.50
1.234,50
1234.5,0.75

İnsanların okuduğu metin için kullanıcının kültürünü, başka bir programın okuduğu her şey için CultureInfo.InvariantCulture'ı kullanın. Almanca bir makinede geçerli kültürle yazılmış bir CSV'de sayıların içinde virgüller olur ve başka yerde okunamaz. .NET 6 ve sonrasında string.Create(CultureInfo.InvariantCulture, $"..."), ara nesne olmadan FormattableString.Invariant ile aynı işi yapar.

Verbatim ve ham interpolated string'ler

$, verbatim interpolated string için @ ile birleşir: ters eğik çizgiler olduğu gibi kalır ve string satırlara yayılabilir. C# 8 ve sonrası iki sırayı da kabul eder ($@ ya da @$); C# 6 ve 7 $@ ister:

Çıktı:

C:\Users\ana\Reports\2026\summary.txt
Report for ana
Year: 2026

C# 11 ham interpolated string'leri ekledi. Tek $ ile süslü parantezler her zamanki gibi ifadeleri işaretler. $$ ile tek süslü parantez olduğu gibi kalır ve ifadeler iki süslü parantez ister; bu da JSON ve kod şablonlarını okunur kılar:

// C# 11 and later
int id = 42;
string name = "Ana";
string json = $$"""
    {
      "id": {{id}},
      "name": "{{name}}"
    }
    """;

C# 11 ayrıca bir interpolation boşluğunun içinde satır sonlarına izin verir, böylece uzun bir ifade ya da bir switch ifadesi birkaç satıra bölünebilir.

Yaygın hatalar

  • $'ı unutmak. "Total: {total}" süslü parantezleri olduğu gibi yazdırır. Derleyici uyarmaz.
  • Süslü parantezler içinde parantezsiz bir ternary: iki nokta bir biçim ayırıcısı olarak okunur.
  • Makinenin okuyacağı çıktıyı geçerli kültürle biçimlendirmek. Ondalık virgüller CSV'yi, JSON'u ve SQL'i bozar. Invariant kültürü kullanın.
  • Para için biçimsiz ToString() kullanmak. 2.5m, 2.50 değil 2.5 olarak yazdırılır. F2, N2 ya da C kullanın.
  • Bir döngüde interpolation ile büyük string'ler oluşturmak. Her yineleme yeni bir string yaratır; StringBuilder ya da string.Join kullanın.

Sıkça Sorulan Sorular

C#'ta string interpolation nedir?

Önüne $ konmuş, süslü parantez içindeki ifadelerin değerlendirilip yerleştirildiği bir string literal'idir: $"Total: {price * qty}". C# 6'da eklendi ve string.Format ile + birleştirmenin çoğu kullanımının yerini alır. Süslü parantezlerin içinde metot çağrıları ve property erişimi dahil her ifade çalışır.

C#'ta bir sayı virgülden sonra 2 basamakla nasıl biçimlendirilir?

İki noktadan sonra bir biçim belirteci ekleyin: $"{price:F2}" ondalık noktadan sonra 2 basamak yazdırır, $"{price:N2}" aynısını binlik ayırıcılarla yapar. Interpolation dışında aynı kodlar price.ToString("F2") ile çalışır. İkisi de değeri değiştirmeden yalnızca gösterim için yuvarlar.

C# interpolated string'de süslü parantezler nasıl kaçırılır?

İkiye katlayın: {{ { yazdırır, }} } yazdırır. Örneğin $"{{ \"id\": {id} }}" { "id": 42 } yazdırır. C# 11 ham interpolated string'lerinde bunun yerine literal'i $$ ile başlatabilirsiniz; böylece tek süslü parantezler olduğu gibi kalır ve {{expr}} bir ifadeyi işaretler.

string.Format ile string interpolation arasındaki fark nedir?

Aynı biçim kodlarıyla aynı sonucu üretirler. string.Format("{0} costs {1:F2}", name, price) argümanlara konumlarıyla başvurur; $"{name} costs {price:F2}" ifadeleri satır içine koyar, bu yüzden okunması daha kolaydır ve argüman sırasını karıştıramaz. Biçim string'inin kendisi bir kaynak dosyasından ya da veritabanından geldiğinde string.Format hâlâ gereklidir.

Interpolated sayım neden nokta yerine virgül gösteriyor?

Interpolation, thread'in geçerli kültürüyle biçimlendirir ve birçok kültür ondalık ayırıcı olarak virgül kullanır. Makinelerin okuduğu çıktılar (dosyalar, JSON, URL'ler) için invariant kültürle biçimlendirin: FormattableString.Invariant($"{value:F2}") ya da .NET 6 ve sonrasında string.Create(CultureInfo.InvariantCulture, $"...").

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA