Другие языки программирования и технологии

Ввод значений с плавающей точкой через запятую C++.

В случае ввода вещественного числа через запятую, дробная часть отбрасывается.
То есть, если мы вводим в консоль 2.3, то получим 2.0, а если введём 2,3 получим само число 2,3
Как исправить данную проблему?
Потому что разделитель целой и дробной части locale-зависимый (в русскоязычной Windows это символ "запятая", а в американской - символ "точка", в других версиях может быть еще какой-то символ).
Поэтому, если вы хотите, чтобы там принималось все что угодно (точка, запятая, пробел) вам возможно стоит написать свой велосипед, который найдет первую не цифру после цифры, принять ее за разделитель, разделить введенную строку на две строки, которые будут целой частью и частью после разделителя, потом их преобразовать в числа и математическими операциями соединить.

А менять системные настройки (символ разделителя в Панели управления) только лишь ради одной программы чревато проблемами в других программах, которые возможно тоже написаны однобоко и в расчете на то, что разделитель тот, который ожидается программистом.
Александр Белов
Александр Белов
76 613
Лучший ответ
Один из вариантов решения проблемы: включить настройки русского языка
setlocale(LC_ALL, ""); // использовать язык из настроек ОС
или
setlocale(LC_ALL, "Russian");
После этого для ввода чисел надо будет использовать только запятую.

Другой вариант более надёжный: вводить число как строку, заменять запятую на точку, преобразовать строку в число при помощи функции stod или atof.
Ввод дробных чисел через точку или запятую зависит от системы на которой исполняется программа. Если у вас русская версия Windows, ввод происходит через запятую, если у вас английская версия - через точку. Всё зависит от операционной системы, скорее всего сменить глобализацию программно можно, я бы сказал каким образом, но знаю только как это сделать в C#.
Павел Фомичёв
Павел Фомичёв
2 850
Prince_On_White Horse А вот и нет.
У меня русская версия Windows, ввод с запятой вместо точки, отсекает дробную часть.