Avatar ·

Как отформатировать число в C# с разделителями тысяч (пробелами или запятыми)?

Всем привет! Я новичок в C# и столкнулся с проблемой форматирования чисел. У меня есть переменная типа `int`, которая хранит большое число, например, 1234567. Мне нужно вывести это число в консоль или на форму в виде "1 234 567" или "1,234,567" — с разделителями тысяч. Я знаю, что в .NET есть метод `String.Format()`, но не могу разобраться, как его правильно применить. Я пробовал писать что-то вроде: ```csharp int number = 1234567; string formatted = String.Format("{0:N}", number); Console.WriteLine(formatted); ``` Это выводит "1,234,567.00" — с двумя нулями после запятой. А мне нужно, чтобы дробной части не было, только целое число с разделителями тысяч. Как убрать десятичные знаки? И можно ли вместо запятой использовать пробел в качестве разделителя? Подскажите, пожалуйста, как правильно настроить формат. Заранее спасибо! <<>>

Использование спецификатора формата "N0"

Вы почти всё сделали правильно. Спецификатор "N" (Number) форматирует число с разделителями групп разрядов и по умолчанию выводит два знака после запятой. Чтобы убрать дробную часть, нужно указать количество десятичных знаков после двоеточия: "N0" — ноль знаков после запятой.

int number = 1234567;
string formatted = String.Format("{0:N0}", number);
Console.WriteLine(formatted); // Вывод: 1,234,567 (запятые как разделители)

Если вы используете интерполяцию строк (C# 6+), код будет ещё короче:

int number = 1234567;
Console.WriteLine($"{number:N0}"); // Вывод: 1,234,567

Как изменить разделитель на пробел?

По умолчанию разделитель тысяч определяется текущей культурой (CultureInfo). В русской локали (ru-RU) это пробел, а в английской (en-US) — запятая. Чтобы принудительно использовать пробел, нужно передать соответствующий объект CultureInfo.

Вариант 1: Указать культуру в методе Format

using System.Globalization;

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

Вариант 2: Создать свою культуру с нужным разделителем

Если вам нужен конкретный символ (например, неразрывный пробел или точка), можно создать копию текущей культуры и изменить свойство NumberGroupSeparator:

using System.Globalization;

int number = 1234567;
CultureInfo customCulture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
customCulture.NumberFormat.NumberGroupSeparator = " "; // пробел

string formatted = number.ToString("N0", customCulture);
Console.WriteLine(formatted); // Вывод: 1 234 567

Альтернативные способы форматирования

  • Спецификатор "### ### ###" — пользовательский формат, где символ # обозначает цифру (если её нет, ничего не выводится).
    string formatted = number.ToString("# ### ###");
    Console.WriteLine(formatted); // Вывод: 1 234 567
  • Спецификатор "0 000 000" — похож на предыдущий, но 0 гарантирует вывод цифры, даже если число меньше (например, 1234 превратится в "0 001 234"). Обычно это не нужно для тысяч.

Важные моменты

  • Метод String.Format и интерполяция строк используют текущую культуру потока. Если приложение работает на сервере с английской локалью, вы получите запятые. Всегда явно указывайте культуру, если формат важен.
  • Для чисел с плавающей точкой (double, decimal) спецификатор "N0" округлит число до целого. Если нужно сохранить дробную часть, используйте "N2" — два знака, "N4" — четыре и т.д.

Теперь ваше число будет выводиться красиво и без лишних нулей!

<<>>

Форматирование через ToString() с пользовательским форматом

Вместо String.Format можно использовать метод ToString() с пользовательским спецификатором формата. Это особенно удобно, когда нужно нестандартное количество разрядов или разделитель.

int number = 1234567;
// Пользовательский формат: группы по три цифры, разделённые пробелом
string formatted = number.ToString("#,0");
Console.WriteLine(formatted); // Вывод: 1,234,567 (с запятыми, если культура en-US)

// Чтобы получить пробелы, укажите культуру ru-RU:
string formattedWithSpaces = number.ToString("#,0", new CultureInfo("ru-RU"));
Console.WriteLine(formattedWithSpaces); // Вывод: 1 234 567

Символ # означает «вывести цифру, если она есть», а 0 — «вывести цифру всегда». Комбинация #,0 гарантирует, что даже для числа 0 будет выведен "0", а не пустая строка.

Для чисел с дробной частью

Если число — double или decimal, и вам нужно сохранить два знака после запятой, используйте:

double price = 1234567.89;
string formatted = price.ToString("#,0.00", new CultureInfo("ru-RU"));
Console.WriteLine(formatted); // Вывод: 1 234 567,89

Этот подход гибче, чем String.Format, когда нужно комбинировать разные части строки, но для простого форматирования числа оба метода равнозначны.