Как отформатировать число в C# с разделителями тысяч (пробелами или запятыми)?
Использование спецификатора формата "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, когда нужно комбинировать разные части строки, но для простого форматирования числа оба метода равнозначны.
Ответов пока нет.
Войдите чтобы оставить ответ