Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/103: Рейтинг темы: голосов - 103, средняя оценка - 4.52
4 / 4 / 0
Регистрация: 04.04.2015
Сообщений: 174

Запятая как разделитель дробной части вместо точки

25.05.2017, 20:11. Показов 21016. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется программа сложения двух чисел:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
int main()
{
double a, b, c;
system("cls");
cout << "Введите первое число: ";
cin >> a;
cout << "Введите второе число: ";
cin >> b;
c = a + b;
cout << "Сумма чисел равна: ";
cout << c << endl << endl;
system("pause");
return 0;
}
Если вводить целые числа или дробные, в которых целая часть отделена точкой, то сложение выполняется корректно. Если же вместо точки задействовать запятую, например, 0,2, то результат работы программы будет иметь следующий вид:
Введите первое число: 0,2
Введите второе число: Сумма чисел равна: 0

Для продолжения нажмите любую клавишу . . .
Есть ли в C++ возможность использовать запятую вместо точки без ущерба корректной работе программы?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.05.2017, 20:11
Ответы с готовыми решениями:

Разделитель целой и дробной части
Как получить текущий разделитель целой и дробной части ? visual studio 2013.

Разделитель целой и дробной части - точка и запятая одновременно
Есть форма с очень большим количеством Edit'ов, предназначенных для ввода чисел с точкой. Есть кнопка типа &quot;Ввод данных&quot;, по...

Как из макроса в Eхcel поменять разделитель целой и дробной части с ',' на '.' ?
Kak is Makrosa v EXcele pomenjat' rasdelitel' celoj i drobnoj 4asti s ',' na '.'?

34
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
25.05.2017, 20:21
C++
1
setlocale(LC_ALL, "RUS");
0
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
25.05.2017, 20:42
watersoda,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>     // std::cin , std::cout, std::endl
#include <sstream>      // std::stringstream
#include <string>       // std::string
#include <cstdlib>      // system("pause");
void f(std::string&, double&);
int main(void)
{
    std::string snum; double a;
    std::cout << "Enter the double: "; std::cin >> snum;
    f(snum, a);
    std::cout << a + 0.33f << std::endl;
    system("pause"); return 0;
}
 
// snum - принимает строку по ссылке
// num - принимает double по ссылке, куда будет записан результат
void f(std::string &snum, double &num) {
    std::stringstream sstr;
    for (auto const& val : snum)
        sstr << (val == ',' ? '.' : val);
    sstr >> num;
}
0
4 / 4 / 0
Регистрация: 04.04.2015
Сообщений: 174
25.05.2017, 20:58  [ТС]
nd2, не работает.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
25.05.2017, 21:00
Цитата Сообщение от watersoda Посмотреть сообщение
nd2, не работает.
Скрин ввода покажи.
0
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
25.05.2017, 21:01
watersoda, немного улучшил, теперь если будет не цифра или ',' то число будет равно 0
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>     // std::cin , std::cout, std::endl
#include <sstream>      // std::stringstream
#include <string>       // std::string
#include <cstdlib>      // system("pause");
int f(std::string&, double&);
int main(void)
{
    std::string snum; double a;
    std::cout << "Enter the double: "; std::cin >> snum;
    f(snum, a);
    std::cout << a << std::endl;
    system("pause"); return 0;
}
 
int f(std::string &snum, double &num) {
    std::stringstream sstr;
    for (auto const& val : snum) {
        if (val >= '0' && val <= '9' || val == ',')
            sstr << (val == ',' ? '.' : val);
        else { num = 0; return 0;}
    }
    sstr >> num;
    return 1;
}
Цитата Сообщение от watersoda Посмотреть сообщение
не работает.
Для setlocale(LC_ALL, "RUS"); используй С-ишную библиотеку #include <clocale>
0
4 / 4 / 0
Регистрация: 04.04.2015
Сообщений: 174
25.05.2017, 21:19  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Скрин ввода покажи.
Только кодировка поломалась:
Миниатюры
Запятая как разделитель дробной части вместо точки  
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
25.05.2017, 21:23
Цитата Сообщение от watersoda Посмотреть сообщение
Только кодировка поломалась:
Это когда это делаешь?
Цитата Сообщение от nd2 Посмотреть сообщение
C++
1
setlocale(LC_ALL, "RUS");
Среда какая?

Добавлено через 1 минуту
Для ввода обычную клавиатуру используешь или цифровую?
0
4 / 4 / 0
Регистрация: 04.04.2015
Сообщений: 174
25.05.2017, 21:25  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Это когда это делаешь?
Да.
Цитата Сообщение от nd2 Посмотреть сообщение
Среда какая?
Dev-C++ 5.11.

Добавлено через 39 секунд
Клавиатура обычная.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.05.2017, 21:28
Так попробуй:
C++
1
setlocale(LC_NUMERIC, "RUS");
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
25.05.2017, 21:31
Цитата Сообщение от watersoda Посмотреть сообщение
Да.
Цитата Сообщение от watersoda Посмотреть сообщение
Dev-C++ 5.11.
У тебя значит mingw, а там с локалями проблемы. Если у тебя нормально выводилась кириллица, то у тебя какие-то дополнительные настройки для русификации сделаны. Обычно для mingw только с этим работает вывод кириллицы (шрифт для консоли Lucida Console):
C++
1
2
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
0
4 / 4 / 0
Регистрация: 04.04.2015
Сообщений: 174
25.05.2017, 21:34  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Так попробуй:
Кодировка выправилась, но с запятой по-прежнему облом.
Миниатюры
Запятая как разделитель дробной части вместо точки  
0
4 / 4 / 0
Регистрация: 04.04.2015
Сообщений: 174
25.05.2017, 21:36  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
У тебя значит mingw, а там с локалями проблемы. Если у тебя нормально выводилась кириллица, то у тебя какие-то дополнительные настройки для русификации сделаны. Обычно для mingw только с этим работает вывод кириллицы (шрифт для консоли Lucida Console):
Ну почему же? В параметрах компилятора прописывается: -finput-charset=CP1251 -fexec-charset=CP866
И кириллица отображается корректно.
0
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
25.05.2017, 21:38
watersoda, я же выше написал функцию f и пример привел как она работает.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
25.05.2017, 21:39
Цитата Сообщение от watersoda Посмотреть сообщение
Ну почему же?
Что "почему же"? Я и говорил, что какие-то дополнительные настройки сделаны:
Цитата Сообщение от watersoda Посмотреть сообщение
В параметрах компилятора прописывается: -finput-charset=CP1251 -fexec-charset=CP866
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.05.2017, 21:42
А у тебя в настройках Windows локализация русская выбрана? В Excel запятая?
Вот это можешь попробовать: Прочитать из файла число с запятой
1
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
25.05.2017, 21:44
nmcf, он хочет чтобы в CMD писал не точку, а запятую и типа считало это, как дробное число.
0
4 / 4 / 0
Регистрация: 04.04.2015
Сообщений: 174
25.05.2017, 21:46  [ТС]
Цитата Сообщение от anapshy Посмотреть сообщение
nmcf, он хочет чтобы в CMD писал не точку, а запятую и типа считало это, как дробное число.
Совершенно верно.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.05.2017, 21:47
anapshy, я понял. Об этом и речь. Может, у него в региональных настройках разделитель - точка. Тогда setlocale() и не работает. А в том примере показано, как задать запятую принудительно.
0
 Аватар для anapshy
531 / 272 / 220
Регистрация: 14.11.2016
Сообщений: 1,052
25.05.2017, 21:51
НА ВСЁ ГОТОВОЕ
Локализацию сам подключишь какую надо
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>     // std::cin , std::cout, std::endl
#include <sstream>      // std::stringstream
#include <string>       // std::string
#include <cstdlib>      // system("pause");
int f(std::string&, double&);
int main(void)
{
    std::string snum;
    double a, b, c;
    system("cls");
    std::cout << "Введите первое число: "; std::cin >> snum; f(snum, a);
    std::cout << "Введите второе число: "; std::cin >> snum; f(snum, b);
    c = a + b;
    std::cout << "Сумма чисел равна: " << c << std::endl << std::endl;
    system("pause"); return 0;
}
 
int f(std::string &snum, double &num) {
    std::stringstream sstr;
    for (auto const& val : snum) {
        if (val >= '0' && val <= '9' || val == ',')
            sstr << (val == ',' ? '.' : val);
        else { num = 0; return 1;}
    }
    sstr >> num;
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.05.2017, 21:51
Помогаю со студенческими работами здесь

Как в Excel 2000 определить - какой разделитель целой/дробной части ?
Вопрос, собстно, в subj. Для Экселя 2002 есть Application.DecimalSeparator, это я нашел. А вот в более ранних версиях -- как узнать, что на...

Разделитель дробной части
Добрый день, есть такая проблема: По умолчанию стоит разделитель дробной части &quot;,&quot; необходимо при вводе числа менять его на...

XMLSerializer и запятая-отделитель дробной части
Добрый день. Слизал из интернета небольшой код для клонирования объектов: public static class Cloner { public...

Разделитель целой и дробной части
Имеется: Console.Write(&quot;A B N = &quot;); Double w; Double istr; w = Console.ReadLine().Split(new char { ' ', '\t', ';' }, ...

Поменять разделитель дробной части числа
Привет всем, при нахождении sin у меня равняется дробное число с запятой, можно ли сделать так, чтобы при нахождении дробное число...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru