В предыдущем разделе мы разобрали строковые заполнители и изучили два способа их использования. Помимо этих двух вариантов, в C# поддерживаются более сложные правила форматирования.
Базовый синтаксис заполнителей формата
{индекс,выравнивание:формат}
1. index (индекс)
Индекс / интерполированная переменная, обязательный параметр
Традиционные цифровые заполнители: Console.WriteLine(«{0}», 123); здесь в позицию {0} подставляется число 123
Интерполяция строк $"": достаточно указать имя переменной без цифрового индекса, пример Console.WriteLine($»Tom is {age} years old»)
Пример кода
int money = 1000;
Console.WriteLine("Исходное значение: {0}", money);
Console.WriteLine("Валютный формат: {0:C}", money);
Console.WriteLine("Выравнивание вправо на 10 символов (валюта): |{0,10:C}|", money);Code language: JavaScript (javascript)
Исходное значение: 1000
Валютный формат: $1,000.00
Выравнивание вправо на 10 символов (валюта): | $1,000.00|
Тот же код через интерполяцию
int money = 500;
Console.WriteLine($"Исходное значение: {money}");
Console.WriteLine($"Валютный формат: {money:C}");
Console.WriteLine($"Выравнивание вправо на 10 символов (валюта): |{money,10:C}|");Code language: JavaScript (javascript)
2. alignment (выравнивание)
Спецификатор выравнивания, необязательный, отделяется запятой ,
Назначение: регулирует минимальную ширину вывода и горизонтальное выравнивание текста
Пример: Console.WriteLine(«{0,10}», 123); // занимает 10 символов, число выравнивается вправо

Как видно, слева от числа 123 много пробелов. Цифра 10 задаёт общую ширину в десять символов: перед 123 добавляется 7 пробелов для выравнивания вправо.
Положительное число: выравнивание вправо, недостающее место заполняется пробелами слева Пример: {0,10} → ширина 10 символов, число справа
Отрицательное число: выравнивание влево, недостающее место заполняется пробелами справа Пример: {0,-10} → ширина 10 символов, число слева
Изменим код следующим образом
Console.WriteLine("{0,-10}", 123); // ширина 10 символов, отрицательное значение — выравнивание влевоCode language: JavaScript (javascript)

Пробелы сложно различить визуально, поэтому добавим вертикальные черты для наглядности
Console.WriteLine("|{0,-10}|", 123);
Console.WriteLine("|{0,10}|", 456);Code language: JavaScript (javascript)

Вертикальные разделители делают поведение очевидным: 10 означает фиксированную ширину в десять символов, минус — выравнивание влево, плюс — вправо, пустые участки заполняются пробелами.
Эквивалентная запись через интерполяцию выглядит так
int one = 123;
int two = 456;
Console.WriteLine($"|{one,-10}|");
Console.WriteLine($"|{two,-10}|");Code language: JavaScript (javascript)

3. format (спецификатор формата)
Поле формата, необязательный параметр, отделяется двоеточием :
Управляет отображением чисел: валюта, фиксированная точка, научная нотация, шестнадцатеричный формат и другое
Структура поля формата :Axx
:должен стоять сразу после заполнителя без пробеловA: однобуквенный спецификатор (9 стандартных встроенных форматов, некоторые чувствительны к регистру)xx: спецификатор точности (опционально, 1–2 цифры; смысл зависит от буквы формата)
// F4: формат с фиксированной точкой, 4 знака после запятой
Console.WriteLine("{0:F4}", 12.345678);
// Аналог через интерполяцию
Console.WriteLine($"{12.345678:F4}");Code language: JavaScript (javascript)

Дополнительные примеры
double myDouble = 12.345678;
Console.WriteLine("{0,-10:G} -- Общий формат", myDouble); // 12.345678 -- Общий формат
Console.WriteLine("{0,-10} -- По умолчанию", myDouble); // 12.345678 -- По умолчанию
Console.WriteLine("{0,-10:F4} -- Фиксированная точка", myDouble); // 12.3457 -- Фиксированная точка
Console.WriteLine("{0,-10:C} -- Валюта", myDouble); // $12.35 -- Валюта
Console.WriteLine("{0,-10:E3} -- Научная нотация", myDouble);//1.235E+001 -- Научная нотация
Console.WriteLine("{0,-10:x} -- Шестнадцатеричное целое", 1194719); // 123adf -- Шестнадцатеричное целоеCode language: JavaScript (javascript)
Таблица 9 стандартных спецификаторов числового формата
| Идентификатор | Название | Действие | Значение точности | Пример вывода |
|---|---|---|---|---|
| C/c | Currency Валюта | Отображение локального знака валюты | Количество знаков после запятой | {0:C} 12.5 → $12.50 |
| D/d | Decimal Десятичное целое | Только для int, дополнение нулями слева | Минимальное количество цифр | {0:D4} 12 → 0012 |
| F/f | Fixed-point Фиксированная точка | Фиксированное число знаков после запятой | Сохраняемые знаки после запятой | {0:F4} 12.345678 →12.3457 |
| G/g | General Общий формат | Автовыбор фиксированной точки или научной нотации, формат по умолчанию | Количество значащих цифр | {0:G4} 12.345678 →12.35 |
| X/x | Hexadecimal Шестнадцатеричный (чувствителен к регистру) | Вывод шестнадцатеричных цифр, X — верхний регистр, x — нижний | Минимальное количество цифр | {0:x} 180026 → 2bf3a |
| N/n | Number Число с разделителями | Разделение разрядов по три цифры | Количество знаков после запятой | {0:N2} 12345678.54321 →12,345,678.54 |
| P/p | Percent Процент | Умножение значения на 100 с добавлением знака % | Количество знаков после запятой | {0:P2} 0.1221897 →12.22 % |
| R/r | Round-trip Возвратный формат | Форматирование без потери точности для обратного преобразования | Параметр точности игнорируется | {0:R} 1234.21897 →1234.21897 |
| E/e | Scientific Научная нотация (чувствительна к регистру) | Экспоненциальная запись, E — верхний регистр, e — нижний | Количество знаков после запятой мантиссы | {0:e4}12.3456789 →1.2346e+001 |
Строки форматирования чисел