Доброго времени суток всем! Недавно столкнулся с такой проблемой: необходимо разделить число типа float по разрядам, пример: "1590270,2018" -> "1 590 270,2018". Попытался решить задачу известными мне способами. Вышло нереально много строк кода. И вообще весь код - костыль. Деление по разрядам нужно только для вывода на экран, никакой логической роли это не играет. Язык программирования c#, среда разработка Visual Studio, под WPF. Вроде бы мелочь, а додуматься никак не могу, помогите решить задачу грамотным путём.
2 Answers
Используйте класс NumberFormatInfo:
var format = (NumberFormatInfo)CultureInfo.InvariantCulture.NumberFormat.Clone();
format.NumberGroupSeparator = " ";
Console.WriteLine(1590270.2018m.ToString("#,0.00", format));
- 36,244
В качестве альтернативы, можно использовать стандартный формат N:
float f = 1590270.2018f;
string s = f.ToString("N3", CultureInfo.GetCultureInfo("ru-RU"));
С другой стороны, если приложение запущено на нерусской системе, то логичнее показывать формат в соответствии с настройками системы. Тогда вы можете не указывать 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.##########");
- 206,799
double, но дляfloatто же самое). – VladD Jan 03 '18 at 21:28