Издревле повелось, что в строковом представлении дробных числах роль разделителя целой от дробной части играет символ точка. И в плюсах код а-ля:
double d;
cin >> d;
cout << d;
считает и выведет дробное число с точкой, если на вход подастся строка "2.5". Однако в шарпе (насколько мне известно, еще в FPC, поправьте, если я ошибаюсь) символ, который будет разделителем, определяется настройками ОС. В нашем случае, если на вход подать строку "2.5" следующим кодом:
double d;
d = double.Parse(Console.ReadLine());
то выбросится исключение, поскольку с точки зрения шарпа, в дробных числах разделителем должна быть запятая. И наоборот, код:
Console.WriteLine(2.5);
выведет строку "2,5", что не принимается тестирующей системой за дробное число. И приходится делать извращения вроде:
double d;
d = double.Parse(Console.ReadLine().Replace('.', ','));
Console.WriteLine(d.ToString().Replace(',', '.'));
Есть ли в шарпе иные способы обхода таких ситуаций (System.Threading не предлагать — CF справедливо блокирует действия записи в этом модуле)? И возможно ли изменить настройки ОС на сервере, чтобы не приходилось вообще обходить это?
Да, шарп + олимпиадное проганье = жесть, но все равно интересно.
На выводе делаю так:
Console.WriteLine(2.5d.ToString(CultureInfo.InvariantCulture));
Не помню чтобы какие-то извращения приходилось делать на входе.
Задавал этот вопрос администрации, они ответили что это личные проблемы пишущих на шарпе людей и со своей стороны они менять ничего не намерены.
Никому не нужен шарп... Можешь скинуть пример кода со считыванием дробных чисел?
Давно не попадались мне задачи на чтение дробных чисел. Сейчас в запуске зашло такое решение:
double d = double.Parse(reader.ReadLine(), System.Globalization.CultureInfo.InvariantCulture); writer.Write(d.ToString(System.Globalization.CultureInfo.InvariantCulture));
А можно у минусующих узнать в чём дело?
ILSpy и System.Reflection сделали свое дело. Код под спойлером.