Форматирование чисел может быть обработано для вас платформой, если вы используете правильную культуру при манипулировании числом.
Console.WriteLine(4.3);
Console.WriteLine(4.3.ToString(CultureInfo.GetCultureInfo("fr-fr")));
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fr-fr");
Console.WriteLine(4.3);
Если вы хотите сделать «одноразовый» дисплей, второй подход будет работать. Если вы хотите правильно отобразить каждое число, вам действительно нужно установить текущую культуру потока . Таким образом, любая числовая манипуляция будет обрабатывать десятичные разделители, группировать символы и любые другие специфические для культуры вещи.
То же самое касается парсинга чисел. Если пользователь вводит 1,234
, как вы узнаете, введены ли они 1.234
(запятая - десятичный разделитель) или 1234
(запятая - разделитель групп)? Вот где культура помогает, поскольку она знает, как отображать числа, а также может использоваться для их правильного анализа:
Console.WriteLine(double.Parse("1,234"));
Console.WriteLine(double.Parse("1,234", CultureInfo.GetCultureInfo("fr-fr")));
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fr-fr");
Console.WriteLine(double.Parse("1,234"));
Выше будет выводиться 1234
(запятая - это десятичный разделитель в моей культуре en-us по умолчанию), 1.234
(запятая - это десятичный разделитель на французском языке) и 1,234
(опять же, запятая десятичный разделитель на французском языке, а также культура потока установлена на французский, поэтому она отображается с использованием этой культуры - отсюда запятая в качестве десятичного разделителя в выходных данных).