1

Доброго времени суток всем! Недавно столкнулся с такой проблемой: необходимо разделить число типа float по разрядам, пример: "1590270,2018" -> "1 590 270,2018". Попытался решить задачу известными мне способами. Вышло нереально много строк кода. И вообще весь код - костыль. Деление по разрядам нужно только для вывода на экран, никакой логической роли это не играет. Язык программирования c#, среда разработка Visual Studio, под WPF. Вроде бы мелочь, а додуматься никак не могу, помогите решить задачу грамотным путём.

Kasper
  • 123

2 Answers2

2

Используйте класс NumberFormatInfo:

var format = (NumberFormatInfo)CultureInfo.InvariantCulture.NumberFormat.Clone();
format.NumberGroupSeparator = " ";
Console.WriteLine(1590270.2018m.ToString("#,0.00", format));

Пример

DreamChild
  • 36,244
2

В качестве альтернативы, можно использовать стандартный формат N:

float f = 1590270.2018f;
string s = f.ToString("N3", CultureInfo.GetCultureInfo("ru-RU"));

https://ideone.com/lhUMSJ


С другой стороны, если приложение запущено на нерусской системе, то логичнее показывать формат в соответствии с настройками системы. Тогда вы можете не указывать CultureInfo:

string s = f.ToString("N3");

и строка будет отформатирована в соответствии с правилами языка, выбранного пользователем. Для русского и французского это будет 12 345 680,000, для немецкого — 12.345.680,000, для английского — 12,345,680.000.


Заметьте, что для больших чисел у float не хватает точности для показа нужного количества знаков после запятой.


Если вам нужно выводить все знаки после запятой, работать через N нельзя, т. к. при этом количество знаков после запятой либо нужно указывать вручную (и тогда выведутся нули), либо берётся по умолчанию. В этом случае у меня сработало вот так:

string s = f.ToString("#,0.##########", CultureInfo.GetCultureInfo("ru-RU"));

или соответственно

string s = f.ToString("#,0.##########");
VladD
  • 206,799
  • Все бы замечательно но эти способы лишний раз округляют число, например 99 999 999 до 100 000 000. – Kasper Jan 03 '18 at 21:16
  • @Kasper: На это есть очень простая причина: эти два числа равны! Проверка: https://ideone.com/s7MXub – VladD Jan 03 '18 at 21:26
  • @Kasper: А вот причина, почему: https://ru.stackoverflow.com/a/191860/10105 (там для double, но для float то же самое). – VladD Jan 03 '18 at 21:28