Как форматировать числа с разделителями тысяч в C#: полный гайд

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: почему запятые в числах — это не просто эстетика

Представьте: вы выводите на экран зарплату сотрудника — 1500000 рублей. Глаз разбегается, ноль цепляется за ноль, и вы трижды пересчитываете разряды. А теперь представьте 1,500,000 — мгновенное понимание суммы. Разница колоссальная.

На Stack Overflow вопрос ".NET String.Format() to add commas in thousands place for a number" набрал десятки тысяч просмотров. Это значит, что разработчики по всему миру бьются над одной и той же задачей: как красиво и правильно отформатировать число с разделителями тысяч в C#. Сегодня мы разберём все подходы — от классического String.Format до современных возможностей C#.

Если вы пишете на C# и работаете с отчётами, финансовыми данными или просто хотите, чтобы ваш UI выглядел профессионально — эта статья для вас. Поехали!

Что такое String.Format() и зачем он нужен?

String.Format() — это статический метод, который позволяет вставлять значения переменных в строку-шаблон с контролем форматирования. В отличие от простой конкатенации, он даёт гибкость: вы можете указать, как именно отображать число — с разделителями, с фиксированным количеством знаков после запятой, в денежном формате и так далее.

Синтаксис прост: String.Format("{0:N}", number), где 0 — индекс аргумента, а N — спецификатор формата. Но дьявол, как всегда, в деталях.

Основной метод: String.Format с форматом "N"

Самый простой и очевидный способ добавить запятые в число — использовать спецификатор формата "N" (от слова Number). Он автоматически добавляет разделители тысяч и задаёт количество десятичных знаков (по умолчанию — 2).

int number = 1234567;
string formatted = String.Format("{0:N}", number);
Console.WriteLine(formatted); // Вывод: 1,234,567.00

Если вам не нужны десятичные знаки, укажите "N0" — ноль означает «ноль знаков после запятой»:

string formatted = String.Format("{0:N0}", number);
Console.WriteLine(formatted); // Вывод: 1,234,567

Важно: символ разделителя тысяч зависит от текущей культуры (CultureInfo). В русской локали это будет пробел (1 234 567), в английской — запятая. Если вам нужна именно запятая независимо от региональных настроек, читайте дальше.

Альтернативы: ToString("N") и интерполяция строк

Современный C# предлагает более элегантные способы. Вместо String.Format вы можете вызвать метод ToString напрямую у числа:

string formatted = number.ToString("N0");
Console.WriteLine(formatted); // 1,234,567

А если вы используете C# 6 и выше, интерполяция строк сделает код ещё читаемее:

string formatted = $"{number:N0}";
Console.WriteLine(formatted); // 1,234,567

Интерполяция — это по сути тот же String.Format, но синтаксически более приятный. Она компилируется в вызов String.Format под капотом, так что производительность идентична.

Тонкая настройка: пользовательские спецификаторы формата

Иногда встроенного формата "N" недостаточно. Например, вам нужно:

  • Использовать пробел вместо запятой
  • Показать знак «+» для положительных чисел
  • Выровнять числа по ширине

Для таких случаев существуют пользовательские строки формата. Вот как задать разделитель тысяч вручную с помощью символа # или 0:

int number = 1234567;
string customFormat = "#,##0";
string formatted = number.ToString(customFormat);
Console.WriteLine(formatted); // 1,234,567

Разберём, что означает "#,##0":

  • # — необязательный разряд (если цифры нет, не выводится ничего)
  • 0 — обязательный разряд (если цифры нет, выводится 0)
  • , — разделитель тысяч

Этот подход даёт полный контроль. Хотите пробелы вместо запятых? Просто замените символ:

string customFormat = "# ##0";
string formatted = number.ToString(customFormat);
Console.WriteLine(formatted); // 1 234 567

Культура (CultureInfo): как заставить C# использовать запятые всегда

Как мы уже упоминали, String.Format и ToString учитывают региональные настройки системы. Если вы пишете приложение для международной аудитории, это может стать проблемой. Решение — явно указать CultureInfo.

Например, чтобы гарантированно получить запятые:

using System.Globalization;

int number = 1234567;
CultureInfo usCulture = new CultureInfo("en-US");
string formatted = number.ToString("N0", usCulture);
Console.WriteLine(formatted); // 1,234,567

А для русской локали с пробелами:

CultureInfo ruCulture = new CultureInfo("ru-RU");
string formatted = number.ToString("N0", ruCulture);
Console.WriteLine(formatted); // 1 234 567

Совет: если ваше приложение должно работать одинаково на всех машинах, всегда передавайте CultureInfo.InvariantCulture или нужную культуру явно. Иначе однажды вы получите баг-репорт: «На сервере в Германии числа отображаются с точками, а не с запятыми».

Сравнение подходов: что выбрать?

Давайте сведём все методы в одну таблицу для наглядности:

Метод Пример Гибкость Производительность
String.Format("{0:N0}", num) 1,234,567 Средняя Хорошая
num.ToString("N0") 1,234,567 Средняя Хорошая
$"{num:N0}" 1,234,567 Средняя Хорошая
num.ToString("#,##0") 1,234,567 Высокая Хорошая
num.ToString("N0", culture) 1,234

Блоги

Рекомендаций по книгам