Введение: почему запятые в числах — это не просто эстетика
Представьте: вы выводите на экран зарплату сотрудника — 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
БлогиРекомендаций по книгамЧитайте также |