Interpolacja stringów buduje string z dosłownego tekstu i wyrażeń. Poprzedź literał znakiem $, umieść dowolne wyrażenie C# w nawiasach klamrowych, a jego wartość zostanie zamieniona na tekst i wstawiona:
Wynik:
Hello, Maya!
3 items at 4.5 = 13.5
Name has 4 letters, upper: MAYA
Free shipping: yes
Interpolacja pojawiła się w C# 6. Kompilator zamienia ją na wywołanie string.Format albo string.Concat (a od C# 10 na wydajniejszy kod z handlerem), więc nie jest wolniejsza niż ręczne budowanie stringu.
Wyrażenie warunkowe w ostatniej linii wymaga nawiasów. Wewnątrz miejsca interpolacji dwukropek rozpoczyna specyfikator formatu, więc {x > 10 ? "yes" : "no"} bez nawiasów to błąd kompilacji.
Specyfikatory formatu
Po wyrażeniu dwukropek i string formatu określają, jak wartość zostanie zapisana. Te same stringi formatu działają z ToString("...") i string.Format.
Wynik:
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
Standardowe kody, każdy opcjonalnie z liczbą określającą precyzję:
| Kod | Nazwa | Przykład | Wynik |
|---|---|---|---|
F lub F2 | Stałoprzecinkowy | {3.14159:F2} | 3.14 |
N lub N0 | Liczba z separatorami grup | {1234.56:N0} | 1,235 |
C | Waluta (symbol i wzorzec kultury) | {9.5:C} w en-US | $9.50 |
D5 | Liczba całkowita dopełniona zerami | {42:D5} | 00042 |
X, x | Szesnastkowy | {255:X} | FF |
E2 | Naukowy | {1234.5:E2} | 1.23E+003 |
P1 | Procent (mnoży przez 100) | {0.256:P1} w en-US | 25.6% |
G | Ogólny (najkrótszy) | {2.50m:G} | 2.50 |
R | Round-trip (double) | {0.1:R} | 0.1 |
Wzorce niestandardowe budują format z symboli zastępczych: 0 to cyfra zawsze wyświetlana, # to cyfra wyświetlana tylko wtedy, gdy jest znacząca, . to separator dziesiętny, , wewnątrz liczby włącza separatory grup, a % mnoży przez 100. "0.##" pokazuje do dwóch miejsc po przecinku i pomija końcowe zera; "#,##0.00" to klasyczny format księgowy.
Każde formatowanie liczb zaokrągla wyświetlaną wartość; sama zmienna się nie zmienia. Gdy wartość leży dokładnie w połowie (2.25 pokazane z jednym miejscem po przecinku), różne środowiska uruchomieniowe i typy mogą różnie rozstrzygać remis, więc jeśli reguła ma znaczenie, najpierw zaokrąglij jawnie przez Math.Round(value, 1, MidpointRounding.AwayFromZero), a potem formatuj.
Daty w interpolacji
Wartości DateTime przyjmują stringi formatu dat w ten sam sposób:
Wynik:
2026-09-24
24/09/2026 16:05
Thu, Sep 24
Shipped at 16:05 on Thursday
ETA 02:10
2.2 hours
Niestandardowy format TimeSpan wymaga poprzedzenia znaków dosłownych ukośnikiem wstecznym, co w zwykłym literale stringu zapisuje się jako \\:. Pełną listę kodów dat (yyyy, MM, HH, tt...) i błędów, jakie się z nimi popełnia (mm to minuty, MM to miesiące), znajdziesz na stronie formatowanie DateTime.
Wyrównanie i dopełnianie
Przecinek po wyrażeniu ustawia minimalną szerokość pola. Liczba dodatnia wyrównuje do prawej, ujemna do lewej. W połączeniu z formatem pozwala wyrównać tabele w zwykłym tekście:
Wynik:
Item | Price| Sold
----------------------------
Espresso | 2.40| 118
Latte | 3.60| 64
Hot chocolate | 4.25| 9
Składnia to {expression,alignment:format}: najpierw wyrównanie, potem format. Wartość dłuższa niż szerokość pola nie jest obcinana; przesuwa resztę linii. PadLeft i PadRight robią to samo dopełnianie poza interpolacją.
Escapowanie nawiasów klamrowych
Żeby wypisać dosłowny nawias klamrowy, podwój go: {{ i }}. Przydaje się to, gdy wynikiem jest JSON, CSS albo kod:
Wynik:
{ "id": 42, "name": "Ana" }
Set literal: {1, 2, 3}
{42}
Ręczne budowanie JSON w ten sposób jest w porządku przy szybkiej linii logu; do prawdziwego JSON używaj serializatora, który poprawnie obsługuje cudzysłowy i znaki specjalne wewnątrz name.
string.Format i formatowanie złożone
Przed C# 6 formatowało się za pomocą string.Format, który przyjmuje numerowane symbole zastępcze i listę argumentów. Tę samą składnię formatowania złożonego akceptują Console.WriteLine, StringBuilder.AppendFormat i TextWriter.Write:
Wynik:
Notebook x4: 14.00
Notebook | 3.50
echo echo !
Dear Leo, your order #000731 has shipped.
W kodzie wybieraj interpolację: wartości stoją tam, gdzie się pojawiają, więc symbol zastępczy nie może wskazać złego argumentu. string.Format pozostaje właściwym narzędziem, gdy szablon jest danymi, na przykład przetłumaczonym komunikatem wczytanym z pliku zasobów. Indeks symbolu zastępczego bez pasującego argumentu ({2} przy dwóch argumentach) rzuca FormatException w czasie działania.
Kultura: kontrola separatorów i waluty
Interpolacja, ToString i string.Format domyślnie używają bieżącej kultury wątku. Na komputerze ustawionym na niemiecki {1234.5:N2} daje 1.234,50; w USA daje 1,234.50. Format waluty C używa symbolu danej kultury. Żeby wybrać kulturę jawnie, przechwyć interpolowany string jako FormattableString i sformatuj go z dostawcą formatu:
Wynik:
Total: 1,234.50
Total: 1.234,50
$1,234.50
1.234,50
1234.5,0.75
Dla tekstu czytanego przez ludzi używaj kultury użytkownika, a dla wszystkiego, co czyta inny program, CultureInfo.InvariantCulture. CSV zapisany z bieżącą kulturą na niemieckim komputerze ma przecinki wewnątrz liczb i gdzie indziej jest nieczytelny. W .NET 6 i nowszych string.Create(CultureInfo.InvariantCulture, $"...") robi to samo co FormattableString.Invariant, bez obiektu pośredniego.
Dosłowne i surowe stringi interpolowane
$ łączy się z @ w dosłowny string interpolowany: ukośniki wsteczne są dosłowne, a string może obejmować wiele linii. C# 8 i nowsze akceptują dowolną kolejność ($@ lub @$); C# 6 i 7 wymagają $@:
Wynik:
C:\Users\ana\Reports\2026\summary.txt
Report for ana
Year: 2026
C# 11 dodał surowe stringi interpolowane. Z jednym $ nawiasy klamrowe jak zwykle oznaczają wyrażenia. Z $$ pojedynczy nawias jest dosłowny, a wyrażenia wymagają dwóch nawiasów, co sprawia, że szablony JSON i kodu dają się czytać:
// C# 11 and later
int id = 42;
string name = "Ana";
string json = $$"""
{
"id": {{id}},
"name": "{{name}}"
}
""";
C# 11 pozwala też na znaki nowej linii wewnątrz miejsca interpolacji, więc długie wyrażenie albo wyrażenie switch można rozbić na kilka linii.
Typowe błędy
- Zapomniany
$."Total: {total}"wypisuje nawiasy dosłownie. Kompilator nie ostrzega. - Operator trójargumentowy bez nawiasów wewnątrz nawiasów klamrowych: dwukropek jest odczytywany jako separator formatu.
- Formatowanie wyjścia czytanego przez maszyny z bieżącą kulturą. Przecinki dziesiętne psują CSV, JSON i SQL. Używaj kultury niezmiennej.
- Używanie
ToString()bez formatu dla kwot pieniędzy.2.5mwypisuje się jako2.5, a nie2.50. UżyjF2,N2alboC. - Budowanie dużych stringów przez interpolację w pętli. Każda iteracja tworzy nowy string; użyj StringBuilder albo
string.Join.
Najczęściej zadawane pytania
Czym jest interpolacja stringów w C#?
To literał stringu poprzedzony $, w którym wyrażenia w nawiasach klamrowych są obliczane i wstawiane: $"Total: {price * qty}". Dodano ją w C# 6 i zastępuje większość zastosowań string.Format oraz łączenia przez +. W nawiasach działa każde wyrażenie, w tym wywołania metod i odczyt właściwości.
Jak sformatować liczbę do 2 miejsc po przecinku w C#?
Dodaj specyfikator formatu po dwukropku: $"{price:F2}" wypisuje 2 cyfry po separatorze dziesiętnym, a $"{price:N2}" robi to samo z separatorami tysięcy. Poza interpolacją te same kody działają z price.ToString("F2"). Oba zaokrąglają wartość do wyświetlenia, nie zmieniając jej.
Jak wstawić nawiasy klamrowe w interpolowanym stringu w C#?
Podwój je: {{ wypisuje {, a }} wypisuje }. Na przykład $"{{ \"id\": {id} }}" wypisuje { "id": 42 }. W surowych stringach interpolowanych z C# 11 możesz zamiast tego zacząć literał od $$, dzięki czemu pojedyncze nawiasy są dosłowne, a {{expr}} oznacza wyrażenie.
Jaka jest różnica między string.Format a interpolacją stringów?
Dają ten sam wynik z tymi samymi kodami formatu. string.Format("{0} costs {1:F2}", name, price) odwołuje się do argumentów po pozycji; $"{name} costs {price:F2}" umieszcza wyrażenia bezpośrednio w tekście, więc łatwiej go czytać i nie da się pomylić kolejności argumentów. string.Format nadal jest potrzebny, gdy sam szablon pochodzi z pliku zasobów albo z bazy danych.
Dlaczego moja interpolowana liczba ma przecinek zamiast kropki?
Interpolacja formatuje według bieżącej kultury wątku, a wiele kultur, w tym polska, używa przecinka jako separatora dziesiętnego. Dla wyjścia czytanego przez maszyny (pliki, JSON, URL-e) formatuj z kulturą niezmienną: FormattableString.Invariant($"{value:F2}"), a w .NET 6 i nowszych string.Create(CultureInfo.InvariantCulture, $"...").