JavaRush /Курсы /C# SELF /Продвинутая интерполяция строк

Продвинутая интерполяция строк

C# SELF
9 уровень , 2 лекция
Открыта

1. Вспоминаем интерполяцию строк

Довольно часто нам нужно не просто вывести строку, а вставить в неё значения переменных. Раньше для этого использовали либо конкатенацию (+), либо метод string.Format. Но с тех пор как в C# появилась магия — строковая интерполяция (string interpolation), — жить стало гораздо лучше.

Как работает интерполяция строк

Добавьте перед строкой символ $, а внутри строки используйте фигурные скобки {} для вставки переменных или даже целых выражений.

Сравнение старого и нового стиля вывода с переменными

string name = "Анна";
int age = 24;

Console.WriteLine("Меня зовут " + name + ", мне " + age + " года."); // Старый стиль
Console.WriteLine($"Меня зовут {name}, мне {age} года."); // Новый стиль!

Можно вставлять прямо вычисления и выражения:


int a = 5, b = 10;
Console.WriteLine($"Сумма {a} + {b} = {a + b}");

2. Как работает интерполяция строк

Перед строкой ставим $, а переменные или выражения обрамляем фигурными скобками {}:


string name = "Анна";
int age = 24;

Console.WriteLine($"Меня зовут {name}, мне {age} года.");
  • Всё, что находится вне скобок — просто текст.
  • Всё, что внутри скобок интерпретируется как C#-код: это может быть имя переменной, арифметика, вызов метода и т.д.

Вычисления и выражения прямо в строке

Интерполяция не ограничивается простыми переменными! Вот что можно делать:

Арифметические выражения
int apples = 7;
int pears = 5;
Console.WriteLine($"У меня всего {apples + pears} фруктов."); // 12
Операции со строками и методами
string city = "Будапешт";
Console.WriteLine($"Город в верхнем регистре: {city.ToUpper()}"); // БУДАПЕШТ
Тернарные операторы, условия
int score = 90;
Console.WriteLine($"Оценка: {(score >= 60 ? "зачёт" : "незачёт")}");
Вызовы методов
string FormatUser(string name, int age) => $"{name} ({age})";
Console.WriteLine($"Пользователь: {FormatUser("Ева", 19)}"); // Пользователь: Ева (19)
Работа с массивами и коллекциями
int[] numbers = { 3, 5, 7 };
Console.WriteLine($"Сумма: {numbers.Sum()}");
Console.WriteLine($"Элементы: {string.Join(", ", numbers)}");
Вложенные выражения и сложные конструкции
var user = new { Name = "Олег", Role = "Admin" };
Console.WriteLine($"Имя: {user.Name}, роль: {(user.Role == "Admin" ? "администратор" : "пользователь")}");
Обратите внимание:

выражения внутри скобок должны быть короткими и читаемыми. Если логика сложная — лучше вычислить её заранее и подставить готовую переменную.

Многоуровневые выражения
var student = new { Name = "Саша", Info = new { Age = 21, Uni = "Harvard" } };
Console.WriteLine($"Имя: {student.Name}, вуз: {student.Info.Uni}");
Преобразования типов на лету
double price = 19.99;
int count = 3;
Console.WriteLine($"Общая стоимость: {price * count} евро");
Дата и время — сразу в нужном виде
DateTime now = DateTime.Now;
Console.WriteLine($"Сегодня: {now.Day}.{now.Month}.{now.Year}");
Пример с циклом
var days = new[] { "Пн", "Вт", "Ср" };
Console.WriteLine($"Дни недели: {string.Join(", ", days)}");

3. Форматирование внутри интерполяции

Часто важно красиво отобразить числа, даты, валюту или проценты.
Интерполяция позволяет прямо внутри скобок указывать формат — после двоеточия.

Общий синтаксис: {выражение:формат}

Форматирование чисел

double num = 1234.5678;
Console.WriteLine($"Округлённое: {num:F2}");     // 1234.57
Console.WriteLine($"В экспоненциальной форме: {num:E1}"); // 1.2E+003
Console.WriteLine($"С разделением разрядов: {num:N}"); // 1 234,57 (зависит от культуры)

Примеры форматов:

  • F2 — два знака после запятой
  • N0 — разделитель тысяч, 0 знаков после запятой
  • E1 — экспоненциальный вид, 1 знак после точки
  • P0 — проценты, 0 знаков после точки
double ratio = 0.1234;
Console.WriteLine($"Проценты: {ratio:P1}"); // 12,3 %

Форматирование дат

DateTime d = new DateTime(2025, 6, 18, 15, 42, 0);
Console.WriteLine($"Дата: {d:dd.MM.yyyy}");         // 18.06.2025
Console.WriteLine($"Время: {d:HH:mm}");             // 15:42
Console.WriteLine($"ISO: {d:yyyy-MM-ddTHH:mm:ss}"); // 2025-06-18T15:42:00

Кратко по форматам дат:

  • dd — день (2 цифры)
  • MM — месяц
  • yyyy — год
  • HH:mm — часы:минуты (24 часа)
  • d — короткая дата по культуре
  • D — длинная дата

Форматирование валют и денег

decimal cost = 2999.5m;
Console.WriteLine($"Цена: {cost:C}"); // 2,999.50 $  (в зависимости от культуры)

Выравнивание и заполнение

Можно задать ширину поля, выравнивание по правому или левому краю:

int val = 7;
Console.WriteLine($"[{val,5}]");  // [    7] — справа
Console.WriteLine($"[{val,-5}]"); // [7    ] — слева

Комбинирование форматов

DateTime dt = DateTime.Now;
Console.WriteLine($"Сегодня {dt:dddd, dd MMMM yyyy}, время {dt:HH:mm}");

Интерполяция с разными типами данных

bool ok = true;
Console.WriteLine($"Операция {(ok ? "успешна" : "ошибка")}");

Многострочные строки с интерполяцией

Так же недавно появились raw string literals и многострочные интерполированные строки:

string user = "Тимур";
int score = 100;

Console.WriteLine($"""
    Поздравляем, {user}!
    Ваш результат: {score}
    """);

Вложенная интерполяция и вычисления

Можно вызывать методы, форматировать их результат и вставлять в строку:

double[] temps = { 23.4, 25.1, 21.9 };
Console.WriteLine($"Средняя температура: {temps.Average():F1}°C");

Пример с таблицей (выравнивание + формат)

Форматирование и выравнивание в таблице с помощью интерполяции

double[] prices = { 123.4, 8.9, 5643.0 };
for (int i = 0; i < prices.Length; i++)
    Console.WriteLine($"Товар {i + 1}: {prices[i,10:F2} евро");

Результат:

Товар 1:    123.40 евро
Товар 2:      8.90 евро
Товар 3:   5643.00 евро

4. Экранирование и интерполяция вместе

Можно использовать экранированные символы и интерполяцию одновременно:

string user = "Маша";
Console.WriteLine($"Привет, \"{user}\"!\nПриятно познакомиться.");

Вывод:

Привет, "Маша"!
Приятно познакомиться.

Если объединить это с дословными строками, то просто сперва ставим $, потом @ (хотя можно и наоборот — они равнозначны):

string path = "C:\\Temp";
Console.WriteLine($@"Найден файл по адресу: ""{path}""");
2
Задача
C# SELF, 9 уровень, 2 лекция
Недоступна
Форматирование чисел и дат в интерполяции.
Форматирование чисел и дат в интерполяции.
2
Задача
C# SELF, 9 уровень, 2 лекция
Недоступна
Таблица данных с выравниванием и форматированием.
Таблица данных с выравниванием и форматированием.
Комментарии (8)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Yula Уровень 11
16 января 2026
По первой задаче, прям жизненно😅 противоречивость требований) Через сайт, принимает решение как в комментарии, а в JetBrains Rider нет. Поторопилась, сдала задачу через сайт. Теперь не могу проверить другое решение через плагин в JetBrains Rider. Кто-нибудь гляньте, кто еще не решил, пройдет такое решение: Console.WriteLine($"Цена товара: {price:N2} ₽, дата покупки: {now.AddDays(-1092):dd.MM.yyyy}, время покупки: {now.AddHours(-4).AddMinutes(-34):HH:mm}"); Соответственно от текущей даты надо будет пересчитать сколько минусовать количество дней и часов с минутами.
Mark Marchenko Уровень 27
6 января 2026
В первой задаче поломан валидатор. Самый легкий способ пройти:

DateTime now = DateTime.Now;
now = new DateTime(2023, 1, 20, 14, 30, 0);
P.S: На практике лучше так не делать 🤡
Alex Pisklov Уровень 3
5 января 2026
is it some kind of a joke or what?! When i use DateTime.Now, i get the following error from the validator: "Учтите, что требование просит вывести строку в точности указанного вида с конкретными датой и временем (20.01.2023, 14:30). Поскольку переменная `now` используется как текущее время, реальный вывод будет отличаться от требуемой фиксированной строки — уточните ожидание задачи. Если требуется точный текст независимо от текущей даты/времени, присвойте `now` фиксированное значение `new DateTime(2023,1,20,14,30,0)`." But when i switch to a fixed date as suggested by the validator, i get this: "Использовать DateTime.Now вместо жёстко заданной даты, чтобы полностью соответствовать требованию. Вывод программы использует фиксированную дату и время, что не соответствует требованию вывода именно указанной строки при использовании текущей даты/времени. Если ожидается строгое совпадение с указанным текстом — заменить присвоение now на DateTime(2023,1,20,14,30,0). Если ожидается использование DateTime.Now — оставить DateTime.Now и учесть, что вывод будет отличаться от точной требуемой строки." In order not to swear, i just say that i am speechless...
Yurii N Уровень 34
29 декабря 2025
Форматирование чисел и дат в интерполяции. - До сих пор содержит противоречивые требования.
Артур Авагян Уровень 11
4 ноября 2025
Рекомендации: Удалите явную замену now на фиксированную дату/время. Требование предполагает использование текущей даты и времени (DateTime.Now) без переопределения для корректного поведения в разных моментах выполнения. Вывести ровно указанную в условии строку невозможно при использовании реальной текущей даты/времени. Либо убрать переопределение now и принять, что вывод будет зависеть от текущего времени, либо изменить тестовые ожидания. Если требуется точный вывод, используйте фиксированную дату/время, но это противоречит требованию 2.
Станислав Уровень 14
23 октября 2025
Это просто какая то жесть, тут и CultureInfo и DateTime. В лекции про интерполяцию строк! Я давно уже замечаю что валидатор просто жесткий, условия выполняешь, а он такой: "О ты вот проверку забыл, но ее в условии не было! Тыж программист.". Я только так решил: using System.Globalization; CultureInfo culture = new CultureInfo("ru-RU"); culture.NumberFormat.NumberGroupSeparator = " "; culture.NumberFormat.NumberDecimalSeparator = ","; DateTime now = DateTime.Now; now = new DateTime(2023,1,20,14,30,0); Console.WriteLine($"Цена товара: {price.ToString("N2", culture)} ₽, дата покупки: {now:dd.MM.yyyy}, время покупки: {now:HH:mm}");
whynot00 Уровень 1
15 сентября 2025
я не понимаю, создатели вообще сами проходили данные задачи? если now оставлять как DateTime.Now, то не проходится 7 условие, где говорится что необходимо задать фиксированную дату, если ставить фиксированную дату, то не проходит второе условие, где говорится что now должно быть равно DateTime.Now
Ra Уровень 35 Student
7 сентября 2025
Вместо Console.WriteLine($"Товар {i + 1}: {prices[i,10:F2} евро"); должно быть Console.WriteLine($"Товар {i + 1}: {prices[i],10:F2} евро");