Menu

Interpolacja stringów i String.Format w C#: formaty, wyrównanie, kultura

Jak działa interpolacja stringów $"..." w C#: wyrażenia w nawiasach klamrowych, specyfikatory formatu takie jak F2, N0, C, D5 i X, wyrównanie w tabelach, escapowanie nawiasów klamrowych, string.Format i formatowanie złożone, dosłowne i surowe stringi interpolowane oraz formatowanie dla konkretnej kultury.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

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ę:

KodNazwaPrzykładWynik
F lub F2Stałoprzecinkowy{3.14159:F2}3.14
N lub N0Liczba z separatorami grup{1234.56:N0}1,235
CWaluta (symbol i wzorzec kultury){9.5:C} w en-US$9.50
D5Liczba całkowita dopełniona zerami{42:D5}00042
X, xSzesnastkowy{255:X}FF
E2Naukowy{1234.5:E2}1.23E+003
P1Procent (mnoży przez 100){0.256:P1} w en-US25.6%
GOgólny (najkrótszy){2.50m:G}2.50
RRound-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.5m wypisuje się jako 2.5, a nie 2.50. Użyj F2, N2 albo C.
  • 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, $"...").

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ