Форматирование и интерполяция строк

Последнее обновление: 05.01.2022

Форматирование строк

При выводе строк в консоли с помощью метода Console.WriteLine для встраивания значений в строку мы можем применять форматирование вместо конкатенации:

string name = "Tom";
int age = 23;

Console.WriteLine("Имя: {0}  Возраст: {1}", name, age);
// консольный вывод
// Имя: Tom  Возраст: 23

В строке "Имя: {0} Возраст: {1}" на место {0} и {1} затем будут вставляться в порядке следования значения переменныйх name и age

То же самое форматирование в строке мы можем сделать не только в методе Console.WriteLine, но и в любом месте программы с помощью метода string.Format:

string name = "Tom";
int age = 23;
string output = string.Format("Имя: {0}  Возраст: {1}", name, age);
Console.WriteLine(output);

Метод Format принимает строку с плейсхолдерами типа {0}, {1} и т.д., а также набор аргументов, которые вставляются на место данных плейсхолдеров. В итоге генерируется новая строка.

Спецификаторы форматирования

В методе Format могут использоваться различные спецификаторы и описатели, которые позволяют настроить вывод данных. Рассмотрим основные описатели. Все используемые форматы:

C / c

Задает формат денежной единицы, указывает количество десятичных разрядов после запятой

D / d

Целочисленный формат, указывает минимальное количество цифр

E / e

Экспоненциальное представление числа, указывает количество десятичных разрядов после запятой

F / f

Формат дробных чисел с фиксированной точкой, указывает количество десятичных разрядов после запятой

G / g

Задает более короткий из двух форматов: F или E

N / n

Также задает формат дробных чисел с фиксированной точкой, определяет количество разрядов после запятой

P / p

Задает отображения знака процентов рядом с число, указывает количество десятичных разрядов после запятой

X / x

Шестнадцатеричный формат числа

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

Для форматирования валюты используется описатель "C":

double number = 23.7;
string result = string.Format("{0:C0}", number);
Console.WriteLine(result); // 24 р.
string result2 = string.Format("{0:C2}", number);
Console.WriteLine(result2); // 23,70 р.

Число после описателя указывает, сколько чисел будет использоваться после разделителя между целой и дробной частью. При выводе также добавляется обозначение денежного знака для текущей культуры компьютера. В зависимости от локализации текущей операционной системы результат может различаться. Также обратите внимание на округление в первом примере.

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

Для форматирования целочисленных значение применяется описатель "d":

int number = 23;
string result = string.Format("{0:d}", number);
Console.WriteLine(result); // 23
string result2 = string.Format("{0:d4}", number);
Console.WriteLine(result2); // 0023

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

Форматирование дробных чисел

Для форматирования дробны чисел используется описатель F, число после которого указывает, сколько знаков будет использоваться после разделителя между целой и дробной частью. Если исходное число - целое, то к нему добавляются разделитель и нули.

int number = 23;
string result = string.Format("{0:f}", number);
Console.WriteLine(result); // 23,00

double number2 = 45.08;
string result2 = string.Format("{0:f4}", number2);
Console.WriteLine(result2); // 45,0800

double number3 = 25.07;
string result3 = string.Format("{0:f1}", number3);
Console.WriteLine(result3); // 25,1

Формат процентов

Описатель "P" задает отображение процентов. Используемый с ним числовой спецификатор указывает, сколько знаков будет после запятой:

decimal number = 0.15345m;
Console.WriteLine("{0:P1}", number);// 15,3%

Настраиваемые форматы

Используя знак #, можно настроить формат вывода. Например, нам надо вывести некоторое число в формате телефона +х (ххх)ххх-хх-хх:

long number = 19876543210;
string result = string.Format("{0:+# (###) ###-##-##}", number);
Console.WriteLine(result); // +1 (987) 654-32-10

Метод ToString

Метод ToString() не только получает строковое описание объекта, но и может осуществлять форматирование. Он поддерживает те же описатели, что используются в методе Format:

long number = 19876543210;
Console.WriteLine(number.ToString("+# (###) ###-##-##"));// +1 (987) 654-32-10

double money = 24.8;
Console.WriteLine(money.ToString("C2")); // 24,80 р.

Интерполяция строк

Интерполяция строк призвана упростить форматирование строк. Так, перепишем пример с выводом значений переменных в строке:

string name = "Tom";
int age = 23;

Console.WriteLine($"Имя: {name}  Возраст: {age}");
// консольный вывод
// Имя: Tom  Возраст: 23

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

Интерполяция по сути представляет более лаконичное форматирование. При этом внутри фигурных скобок мы можем указывать не только свойства, но и различные выражения языка C#:

int x = 8;
int y = 7;
string result = $"{x} + {y} = {x + y}";
Console.WriteLine(result); // 8 + 7 = 15

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

int x = 8;
int y = 7;
string result = $"{x} * {y} = {Multiply(x, y)}";
Console.WriteLine(result); // 8 * 7 = 56

int Multiply(int a, int b) => a * b;

Уже внутри строки можно применять форматирование. В этом случае мы можем применять все те же описатели, что и в методе Format. Например, выведем номер телефона в формате +x xxx-xxx-xx-xx:

long number = 19876543210;
Console.WriteLine($"{number:+# ### ### ## ##}"); // +1 987 654 32 10

Добавляем пространство до и после форматируемого вывода:

string name = "Tom";
int age = 23;

Console.WriteLine($"Имя: {name, -5} Возраст: {age}"); // пробелы после
Console.WriteLine($"Имя: {name, 5} Возраст: {age}"); // пробелы до

Вывод:

Имя: Том      Возраст: 23
Имя:      Том Возраст: 23
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850