Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2017, 15:29   #21
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Нет!! В том то и дело что коррелирует именно с наличием setlocale(LC_ALL,"rus");!!!
Его убираешь из программы и всё нормально!
Уже всё сделал как вы сказали strlen стоит и всё норм!
Но в вашей программе нет setlocale(LC_ALL,"rus"); и все срабатывало сразу. А у меня есть и не было норм результата пока методом тыка не убрал тогда стало норм.
KAMLS вне форума Ответить с цитированием
Старый 08.05.2017, 15:32   #22
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Вот код работающей программы с вводом значения $333.34 Если есть setlocale(LC_ALL,"rus"); то вместо вывода 333.34 будет вывод 333.00
Убрать setlocale(LC_ALL,"rus"); и становится как надо, но тогда вместо русских букв кракозябры.
Код:
#include<iostream>
#include<conio.h>
#include<cstdlib>
#include<math.h>
#include<iomanip>
using namespace std;
class money
{
private:
	int a;
	long double summa;
	char str [23];
public:
	money (): summa(0), a(0)
	{}
	long double mstold()
	{
		char str1[23];
		cout<<"Введите денежную строку: \n";
		cin.get(str1, 23);
		for(int j=0; j<strlen(str1); j++)
		{
			if ( isdigit (str1[j]) || str1[j]=='.') // если перые символы строки str - число
			{
				str[a]=str1[j];
				a++;
			}
			
		}
		str[a]='\0';
		long double summa=atof(str);
		return summa;	
	}
};
int main()
{
	setlocale(LC_ALL,"rus");
	long double b;
	money m1;
	b=m1.mstold();
	cout<<setiosflags(ios::fixed)
		<<setiosflags(ios::showpoint)
		<<setprecision(2)
		<<b;
	getch();
	return 0;
}
KAMLS вне форума Ответить с цитированием
Старый 08.05.2017, 15:34   #23
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну так определяйте в каком месте проблема.

Начните с вывода str1[j], если там все ок, то str[a]. Если и там все ок, то результат atof.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 08.05.2017, 15:49   #24
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Может я как то сумбурно излагаю.. В общем проблема найдена.
Она заключается в наличии оператора setlocale(LC_ALL,"rus");
Он нужен для того, чтобы текст на русском языке, в процессе выполнения программы, отображался именно русскими буквами.
Если я не ставлю этот оператор, то вместо русских букв, появляются всякие каракули.
Если в программе есть этот оператор, то введенное, либо прописанное в программе значение строки $333.34 после прохождения функции isdigit и atof на выводе будет выглядеть как 333.00
Если этот оператор убрать, то вместо русских букв "Введите денежную строку:" будут всякие каракули иероглифы, но значение строки $333.34 будет выведено правильно 333.34
То есть проблема заключается в наличии оператора setlocale(LC_ALL,"rus");
Как сделать так, чтобы он был, но при этом не страдало качество вывода значения строки?
KAMLS вне форума Ответить с цитированием
Старый 08.05.2017, 15:52   #25
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну так все равно надо ж определить на каком этапе в этом случае возникает проблема (как и в любой другой непонятной ситуации): сразу при вводе, или при фильтрации, или при конвертации в число.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 08.05.2017, 16:47   #26
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
чтобы текст на русском языке, в процессе выполнения программы, отображался именно русскими буквами
Локаль влияет не только на текст.
Цитата:
Сообщение от KAMLS Посмотреть сообщение
333.34
А Вы в школе же использовали запятую
как десятичный разделитель, а не точку, так ведь?
Croessmah вне форума Ответить с цитированием
Старый 08.05.2017, 16:48   #27
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Пытался но не умею я. Куда мне, я еще и язык то толком не выучил..
Вот пытался отладкой, да не понимаю я на каком этапе. Жму F10 покадрово вроде, а в момент когда вводишь $333.34 (т.е. жмешь интер) там сразу хоп! и всё уже..
вот после этого хоп сделал скриншот. Не знаю как интерпретировать эти данные. Вроде вывода еще не произошло, на консоли нет выведенного значения 333.00 но в окне вкладки "Локальные" видно, что b уже равен 333.00
А на каком этапе, не пойму.
Изображения
Тип файла: jpg кадр_7.jpg (113.1 Кб, 137 просмотров)
KAMLS вне форума Ответить с цитированием
Старый 08.05.2017, 16:49   #28
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Для отладки можно пользоваться и просто выводом в консоль.
Код:
cout << str1[j] << endl;
Ну раз в str все ок (как видно на скриншоте), то очевидно дело в atof и надо читать ее документацию.

http://en.cppreference.com/w/cpp/string/byte/atof
Цитата:
Function discards any whitespace characters (as determined by std::isspace()) until first non-whitespace character is found. Then it takes as many characters as possible to form a valid floating-point representation and converts them to a floating-point value.

The valid floating-point value can be one of the following:
- decimal floating-point expression. It consists of the following parts:
-- (optional) plus or minus sign
-- nonempty sequence of decimal digits optionally containing decimal-point character (as determined by the current C locale)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 08.05.2017 в 16:57.
Alex11223 вне форума Ответить с цитированием
Старый 08.05.2017, 16:54   #29
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Не успел сам написать сделал код так
Код:
#include<iostream>
#include<conio.h>
#include<cstdlib>
#include<math.h>
#include<iomanip>
using namespace std;
class money
{
private:
	int a;
	long double summa;
	char str [23];
public:
	money (): summa(0), a(0)
	{}
	void mstold()
	{
		char str1[23];
		cout<<"Введите денежную строку: \n";
		cin.get(str1, 23);
		for(int j=0; j<strlen(str1); j++)
		{
			if ( isdigit (str1[j]) || str1[j]=='.') // если перые символы строки str - число
			{
				str[a]=str1[j];
				a++;
			}
			
		}
		str[a]='\0';
		cout<<str;
	}
};
int main()
{
	setlocale(LC_ALL,"rus");
	long double b;
	money m1;
	m1.mstold();
	
	getch();
	return 0;
}
Выводит как надо, понял что дело в atof
KAMLS вне форума Ответить с цитированием
Старый 08.05.2017, 16:56   #30
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Дык написали ж уже. Скорее всего в вашей локали разделитель десятичной части не точка, а например запятая.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование значений ячеек из одной строки в другую ольгаг Microsoft Office Excel 1 19.12.2016 10:47
умножение одной матрицы на другую (выводить не только ответ, но и ход решения) Delphi или C++ carrie bradshaw Помощь студентам 0 29.04.2014 00:20
Переход с одной строки на другую в DBF сканировании danxiel Помощь студентам 2 04.09.2012 14:15
MS SQL SERVER 2005 копирование таблицы из ОДНОЙ БД В другую или перенести все строки из одной таблицы в другую reihtmonbern БД в Delphi 4 17.07.2012 23:25
Перенос данных из строки одной таблицы БД в другую БД Optigood БД в Delphi 15 12.05.2010 17:07