Avatar ·

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

Всем привет! Я начинающий C# разработчик, и столкнулся с такой задачей: нужно вывести на экран число с разделителями тысяч — то есть чтобы число 1234567 отображалось как "1,234,567". Я использую `String.Format()` или просто вставляю переменную в строку через `$""`, но пока не могу добиться нужного результата. Вот пример моего кода: ```csharp int number = 1234567; string result = String.Format("Сумма: {0}", number); Console.WriteLine(result); ``` На выходе получаю просто "Сумма: 1234567", а мне нужно "Сумма: 1,234,567". Пробовал добавлять разные спецификаторы в форматную строку, но пока безуспешно. Подскажите, как правильно это сделать? Желательно с примерами кода, чтобы я сразу мог проверить. Заранее спасибо! <<>>

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

В C# для добавления разделителей тысяч (запятых) в число при форматировании строки используется стандартный спецификатор числового формата "N" (или "n"). Он автоматически добавляет разделители групп разрядов (тысяч, миллионов и т.д.) в соответствии с текущей культурой (локализацией) системы. По умолчанию для русской локали это пробел, а для английской — запятая.

Чтобы гарантированно получить запятые, нужно явно указать культуру CultureInfo.InvariantCulture или английскую культуру (en-US). Вот как это работает:

int number = 1234567;
// Вариант 1: с явным указанием культуры (запятые)
string result = String.Format(CultureInfo.InvariantCulture, "Сумма: {0:N0}", number);
Console.WriteLine(result); // Вывод: Сумма: 1,234,567

// Вариант 2: через интерполяцию строк (C# 6+)
string result2 = $"Сумма: {number:N0}";
Console.WriteLine(result2); // Вывод: Сумма: 1,234,567 (если культура системы — en-US)

// Вариант 3: с указанием английской культуры явно
string result3 = number.ToString("N0", new CultureInfo("en-US"));
Console.WriteLine("Сумма: " + result3); // Вывод: Сумма: 1,234,567

Детали спецификатора "N"

Спецификатор "N" поддерживает необязательный параметр — количество десятичных знаков после запятой. Например:

  • {0:N0} — без десятичных знаков (целое число, только разделители тысяч).
  • {0:N2} — два знака после запятой (например, 1,234,567.89).
  • {0:N4} — четыре знака после запятой.

Если не указать количество знаков, по умолчанию будет использоваться значение из текущей культуры (обычно 2). Для целых чисел лучше всегда писать N0.

Что делать, если нужно именно запятые, а не пробелы?

Если ваша система настроена на русскую культуру (русский язык), то по умолчанию разделителем тысяч будет пробел (неразрывный). Чтобы принудительно использовать запятую, используйте CultureInfo.InvariantCulture или new CultureInfo("en-US"):

// Русская культура — пробел
CultureInfo.CurrentCulture = new CultureInfo("ru-RU");
Console.WriteLine($"{1234567:N0}"); // Вывод: 1 234 567

// Инвариантная культура — запятая
Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "{0:N0}", 1234567)); // Вывод: 1,234,567

Полный пример для консольного приложения

using System;
using System.Globalization;

class Program
{
    static void Main()
    {
        int number = 1234567;
        
        // Лучший способ — с InvariantCulture
        string formatted = string.Format(CultureInfo.InvariantCulture, "Итого: {0:N0}", number);
        Console.WriteLine(formatted);
        
        // Альтернатива через ToString
        Console.WriteLine("Сумма: " + number.ToString("N0", CultureInfo.InvariantCulture));
        
        // Для дробных чисел
        double price = 1234567.89;
        Console.WriteLine($"Цена: {price:N2}"); // Цена: 1,234,567.89 (с InvariantCulture)
    }
}

Важные замечания

  • Спецификатор "N" работает для всех числовых типов: int, long, float, double, decimal.
  • Если вы работаете с валютами, используйте спецификатор "C" — он тоже добавляет разделители тысяч и знак валюты.
  • Для пользовательского формата (например, только запятые без десятичных знаков) можно использовать #,##0 — но спецификатор "N0" проще и надёжнее.
<<>>

Кастомный формат через строку форматирования

Если вы хотите полностью контролировать внешний вид числа (например, добавить пробелы вместо запятых или изменить количество разрядов), можно использовать пользовательский числовой формат. Например, строка "#,##0" означает: разделитель тысяч — запятая, ноль отображается как "0".

int number = 1234567;
string result = number.ToString("#,##0");
Console.WriteLine(result); // Вывод: 1,234,567

// Для дробных чисел:
double value = 1234567.8912;
Console.WriteLine(value.ToString("#,##0.00")); // Вывод: 1,234,567.89

Обратите внимание: если вы используете String.Format, синтаксис будет таким:

string result = string.Format("{0:#,##0}", 1234567);

Этот подход даёт больше гибкости, но требует знания символов формата (# — необязательная цифра, 0 — обязательная, , — разделитель тысяч, . — десятичный разделитель). Для простых задач лучше использовать стандартный спецификатор "N", описанный в первом ответе.