Интерполяция строк собирает строку из буквального текста и выражений. Поставьте перед литералом $, поместите любое выражение C# в фигурные скобки, и его значение будет преобразовано в текст и подставлено:
Вывод:
Hello, Maya!
3 items at 4.5 = 13.5
Name has 4 letters, upper: MAYA
Free shipping: yes
Интерполяция появилась в C# 6. Компилятор превращает её в вызов string.Format или string.Concat (а начиная с C# 10 в более эффективный код обработчика), поэтому она не медленнее, чем сборка строки вручную.
Условному выражению в последней строке нужны скобки. Внутри интерполяционной вставки двоеточие начинает спецификатор формата, поэтому {x > 10 ? "yes" : "no"} без скобок вызывает ошибку компиляции.
Спецификаторы формата
После выражения двоеточие и строка формата определяют, как записывается значение. Те же строки формата работают с ToString("...") и string.Format.
Вывод:
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
Стандартные коды, за каждым из которых может следовать число точности:
| Код | Название | Пример | Результат |
|---|---|---|---|
F или F2 | С фиксированной точкой | {3.14159:F2} | 3.14 |
N или N0 | Число с разделителями групп | {1234.56:N0} | 1,235 |
C | Валюта (символ и шаблон культуры) | {9.5:C} в en-US | $9.50 |
D5 | Целое, дополненное нулями | {42:D5} | 00042 |
X, x | Шестнадцатеричный | {255:X} | FF |
E2 | Экспоненциальный | {1234.5:E2} | 1.23E+003 |
P1 | Процент (умножает на 100) | {0.256:P1} в en-US | 25.6% |
G | Общий (кратчайший) | {2.50m:G} | 2.50 |
R | Для обратного преобразования (double) | {0.1:R} | 0.1 |
Пользовательские шаблоны строят формат из заполнителей: 0 это цифра, которая показывается всегда, # это цифра, которая показывается только если она значима, . это десятичный разделитель, , внутри числа включает разделители групп, а % умножает на 100. "0.##" показывает до двух знаков после запятой и убирает нули в конце; "#,##0.00" это классический бухгалтерский формат.
Всё числовое форматирование округляет отображаемое значение; сама переменная не меняется. Когда значение находится ровно посередине (2.25 с одним знаком после запятой), разные среды выполнения и типы могут округлять такой случай по-разному, поэтому если правило важно, сначала явно округлите через Math.Round(value, 1, MidpointRounding.AwayFromZero), а затем форматируйте.
Даты в интерполяции
Значения DateTime так же принимают строки формата дат:
Вывод:
2026-09-24
24/09/2026 16:05
Thu, Sep 24
Shipped at 16:05 on Thursday
ETA 02:10
2.2 hours
Пользовательский формат TimeSpan требует экранировать буквальные символы обратным слешем, который в обычном строковом литерале записывается как \\:. Полный список кодов дат (yyyy, MM, HH, tt...) и ошибки, которые с ними допускают (mm это минуты, MM это месяцы), на странице формат DateTime.
Выравнивание и дополнение
Запятая после выражения задаёт минимальную ширину поля. Положительное число выравнивает по правому краю, отрицательное по левому. Вместе с форматом это выстраивает таблицы в обычном тексте:
Вывод:
Item | Price| Sold
----------------------------
Espresso | 2.40| 118
Latte | 3.60| 64
Hot chocolate | 4.25| 9
Синтаксис такой: {expression,alignment:format}, сначала выравнивание, затем формат. Значение длиннее ширины не обрезается; оно сдвигает остаток строки. PadLeft и PadRight делают такое же дополнение вне интерполяции.
Экранирование фигурных скобок
Чтобы напечатать буквальную скобку, удвойте её: {{ и }}. Это нужно, когда вывод это JSON, CSS или код:
Вывод:
{ "id": 42, "name": "Ana" }
Set literal: {1, 2, 3}
{42}
Собирать JSON вручную вот так нормально для быстрой строки в логе; для настоящего JSON используйте сериализатор, который правильно обработает кавычки и специальные символы внутри name.
string.Format и составное форматирование
До C# 6 форматирование выполняли через string.Format, который принимает нумерованные заполнители и список аргументов. Тот же синтаксис составного форматирования принимают Console.WriteLine, StringBuilder.AppendFormat и TextWriter.Write:
Вывод:
Notebook x4: 14.00
Notebook | 3.50
echo echo !
Dear Leo, your order #000731 has shipped.
В коде предпочитайте интерполяцию: значения стоят там, где они появляются, поэтому заполнитель не может указать на не тот аргумент. string.Format остаётся правильным инструментом, когда шаблон это данные, например переведённое сообщение, загруженное из файла ресурсов. Индекс заполнителя без соответствующего аргумента ({2} при двух аргументах) выбрасывает FormatException во время выполнения.
Культура: управление разделителями и валютой
Интерполяция, ToString и string.Format по умолчанию используют текущую культуру потока. На машине с немецкими настройками {1234.5:N2} даёт 1.234,50; в США 1,234.50. Формат валюты C использует символ культуры. Чтобы выбрать культуру явно, сохраните интерполированную строку как FormattableString и отформатируйте её с поставщиком формата:
Вывод:
Total: 1,234.50
Total: 1.234,50
$1,234.50
1.234,50
1234.5,0.75
Используйте культуру пользователя для текста, который читают люди, и CultureInfo.InvariantCulture для всего, что читает другая программа. CSV, записанный с текущей культурой на немецкой машине, содержит запятые внутри чисел и не читается в других местах. В .NET 6 и новее string.Create(CultureInfo.InvariantCulture, $"...") делает то же, что FormattableString.Invariant, без промежуточного объекта.
Verbatim и необработанные интерполированные строки
$ сочетается с @ в verbatim-интерполированной строке: обратные слеши буквальные, и строка может занимать несколько строк. C# 8 и новее принимают любой порядок ($@ или @$); C# 6 и 7 требуют $@:
Вывод:
C:\Users\ana\Reports\2026\summary.txt
Report for ana
Year: 2026
C# 11 добавил необработанные интерполированные строки. С одним $ скобки, как обычно, обозначают выражения. С $$ одиночная скобка становится буквальной, а выражениям нужны две скобки, что делает шаблоны JSON и кода читаемыми:
// C# 11 and later
int id = 42;
string name = "Ana";
string json = $$"""
{
"id": {{id}},
"name": "{{name}}"
}
""";
C# 11 также разрешает переводы строк внутри интерполяционной вставки, поэтому длинное выражение или switch-выражение можно разбить на несколько строк.
Частые ошибки
- Забытый
$."Total: {total}"печатает скобки буквально. Компилятор не предупреждает. - Тернарный оператор без скобок внутри вставки: двоеточие читается как разделитель формата.
- Форматирование машиночитаемого вывода с текущей культурой. Десятичные запятые ломают CSV, JSON и SQL. Используйте инвариантную культуру.
ToString()без формата для денег.2.5mпечатается как2.5, а не2.50. ИспользуйтеF2,N2илиC.- Сборка больших строк интерполяцией в цикле. Каждая итерация создаёт новую строку; используйте StringBuilder или
string.Join.
Часто задаваемые вопросы
Что такое интерполяция строк в C#?
Строковый литерал с префиксом $, в котором выражения в фигурных скобках вычисляются и подставляются: $"Total: {price * qty}". Она появилась в C# 6 и заменяет большинство случаев использования string.Format и конкатенации через +. Внутри скобок работает любое выражение, включая вызовы методов и обращение к свойствам.
Как вывести число с двумя знаками после запятой в C#?
Добавьте спецификатор формата после двоеточия: $"{price:F2}" выводит 2 цифры после десятичного разделителя, а $"{price:N2}" делает то же с разделителями тысяч. Вне интерполяции те же коды работают с price.ToString("F2"). Оба варианта округляют значение для отображения, не изменяя его.
Как экранировать фигурные скобки в интерполированной строке C#?
Удвойте их: {{ печатает {, а }} печатает }. Например, $"{{ \"id\": {id} }}" печатает { "id": 42 }. В необработанных интерполированных строках C# 11 можно вместо этого начать литерал с $$, чтобы одиночные скобки стали буквальными, а {{expr}} обозначало выражение.
Чем string.Format отличается от интерполяции строк?
Они дают одинаковый результат с одинаковыми кодами формата. string.Format("{0} costs {1:F2}", name, price) ссылается на аргументы по позиции; $"{name} costs {price:F2}" вставляет выражения прямо в текст, поэтому её легче читать и в ней нельзя перепутать порядок аргументов. string.Format по-прежнему нужен, когда сама строка формата приходит из файла ресурсов или базы данных.
Почему в интерполированном числе запятая вместо точки?
Интерполяция форматирует с текущей культурой потока, а во многих культурах десятичный разделитель это запятая. Для вывода, который читают программы (файлы, JSON, URL), форматируйте с инвариантной культурой: FormattableString.Invariant($"{value:F2}") или в .NET 6 и новее string.Create(CultureInfo.InvariantCulture, $"...").