Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
#1

Преобразование string в long double - C++

25.07.2014, 03:16. Просмотров 1601. Ответов 14
Метки нет (Все метки)

Одним из недостатков C++ является отсутствие для бизнес-программ
встроенного типа для денежных значений, такого, как $173 698 001,32.
Такой денежный тип должен иметь возможность для хранения числа с
фиксированной десятичной точкой точностью около 17 знаков, которого
было бы достаточно для хранения национального долга в долларах и цен-
тах. К счастью, встроенный тип C++ long double имеет точность 19 цифр,
поэтому мы можем использовать его как базисный для класса money, даже
используя плавающую точку. Однако нам нужно будет добавить возмож-
ность ввода и вывода денежных значений с предшествующим им знаком
доллара и разделенными запятыми группы по три числа: так проще читать
большие числа. Первым делом при разработке такого класса напишем ме-
тод mstold(), который принимает денежную строку, то есть строку, пред-
ставляющую собой некоторое количество денег типа
"$1,234,567,890,123.99"
в качестве аргумента и возвращает эквивалентное ее значению число типа
long double.
Вам нужно будет обработать денежную строку как массив символов и,
просматривая ее символ за символом, скопировать из нее только цифры
(0-9) и десятичную точку в другую строку. Игнорируется все остальное,
включая знак доллара и запятые. Затем вы можете использовать биб-
лиотечную функцию _atold() (заметим, что здесь название функции на-
чинается с символа подчеркивания — заголовочные файлы STDLIB.H или
MATH.H) для преобразования новой строки к числу типа long double. Пред-
полагаем, что денежное значение не может быть отрицательным. Напи-
шите функцию main() для проверки метода mstold(), которая несколько
раз получает денежную строку от пользователя и выводит соответству-
ющее число типа long double.


программа сделана, но запустить не могу, не работает функция _atold преобразующая string > long double
подключение разных библиотек не помогает, сами посмотрите сколько я их навключала


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
28
29
30
31
32
33
34
35
36
37
38
39
#include "stdafx.h"
#include<iostream>
#include <string>
#include <stdlib.h>
#include <math.h>
using namespace std;
class Money
{
private:
    string strMon;
    long double summ;
public:
    long double mstold()
    {
        cout << "Enter the amount in decimal point. End with a dollar sign"; 
        getline(cin, strMon, '$');
 
        int wlen = strMon.length();
        int n;
        string number;
 
        for (int j = 0; j < wlen; j++)
            if (strMon[j] != ('.'||'$'))
                strMon[j] = number[n++];
        long double summ =_atold(number);    
    }
    void display()const
    {
        cout << "\n" << summ << endl;
    }
};
 
int main()
{
    Money money;
    money.mstold();
    money.display();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2014, 03:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Преобразование string в long double (C++):

Преобразование long double в string - C++
Здравствуйте уважаемые форум чане! Будьте так добры, подскажите выход из сложившейся ситуации!Как преобразовать числовое значение допустим...

Преобразование long double в char - C++
Вернемся к обсуждению денежных строк из упражнения 6. Напишите ме- од ldtoms() для преобразования числа типа long double в денежную строку,...

Преобразование строки в long double - C++
Друзья, в Лафоре есть задача номер 7 в главе 7. Её суть: пользователь вводит строку, программа должна считывать только цифры и символ...

Перевод long double в string - C++
Дана задача http://www.cyberforum.ru/attachment.php?attachmentid=97778&amp;stc=1&amp;d=1317238135 Я не понимаю как конвертировать...

При переводе string в long double теряется дробная часть - C++
Помогите с программой. При переводе string в long double дробная часть становится равной нулю(не зависит от длины числа). #include...

Как написать такое явное преобразование из double в unsigned long int - C++
как написать такое явное преобразование из double в unsigned long int??? спасибо всем кто поможет...

14
Renji
1963 / 1361 / 307
Регистрация: 05.06.2014
Сообщений: 3,893
25.07.2014, 04:55 #2
программа сделана, но запустить не могу, не работает функция _atold преобразующая string > long double
И не будет работать. Может atold и было в C который учил ваш преподаватель, но его нет в C++ которому он учит вас. А нужно вам stold (C++11) и другого преподавателя.
Такой денежный тип должен иметь возможность для хранения числа с
фиксированной десятичной точкой точностью около 17 знаков, которого
было бы достаточно для хранения национального долга в долларах и цен-
тах.
Такой денежный тип должен иметь возможность выполнения вычислений без ошибки округления. double автоматически дает ошибку округления, как только в него пихают дробь отличную от A/2^B (например, 0.3). А национальный долг храните в 64 битовых центах и не выпендривайтесь.
0
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 05:16  [ТС] #3
Цитата Сообщение от Renji Посмотреть сообщение
Такой денежный тип должен иметь возможность выполнения вычислений без ошибки округления. double автоматически дает ошибку округления, как только в него пихают дробь отличную от A/2^B (например, 0.3). А национальный долг храните в 64 битовых центах и не выпендривайтесь.
спокойствие) это всего ишь Лафоре ООП и да, он любит повыпендриваться в своей книге, я уже заметила. увы, других учителей нет, даже в универе толковых не водится, так что сама жую гранит науки)
а можете конкретно подправить строку кода, как правильно использовать эту функцию?
и какая библиотека нужна?

Добавлено через 6 минут
программа заработала но не делает того что нужно. выдает ошибку.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "stdafx.h"
#include<iostream>
#include <string>
#include <stdlib.h>
#include <math.h>
using namespace std;
class Money
{
private:
    string strMon;
    long double summ;
public:
    long double mstold()
    {
        cout << "Enter the amount in decimal point. End with a dollar sign" << endl; 
        getline(cin, strMon, '$');
 
        int wlen = strMon.length();
        int n=0;
        string number;
 
        for (int j = 0; j < wlen; j++)
            if (strMon[j] != ('.'||'$'))
                strMon[j] = number[n++];
        long double summ =stold(number);    
        return summ;
    }
    void display()const
    {
        cout << "\n" << summ << endl;
    }
};
 
 
 
 
int main()
{
    Money money;
    money.mstold();
    money.display();
    return 0;
}
1
Renji
1963 / 1361 / 307
Регистрация: 05.06.2014
Сообщений: 3,893
25.07.2014, 05:27 #4
программа заработала но не делает того что нужно. выдает ошибку.
strMon[j] = number[n++]; заменить на number.push_back(strMon[j]); Массивы C++ не расширяются сами собой. И вообще, вы в strMon вместо number писали.
long double summ =stold(number); заменить на summ =stold(number); иначе результат уходит не в класс, а в локальную переменную.
0
zss
Модератор
Эксперт С++
6530 / 6092 / 2006
Регистрация: 18.12.2011
Сообщений: 15,841
Завершенные тесты: 1
25.07.2014, 08:53 #5
Я бы сделал так
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <strstream> 
using namespace std;
class Money
{
private:
    char str[100]; // Рабочая переменная 
    long summ; // Здесь храним сумму  в центах
    void str2summ()
    {
        char *pos;
        if(str[0]=='$')
            str[0]=' '; // если $ в начале строки
        else if( (pos=strchr(str,'$'))!=NULL )
            *pos=0; // заменяем '$' на нуль(конец строки)
        if( (pos=strchr(str,'.'))!=NULL ) // имеется точка 
        {
            pos[0]=pos[1];// убираем току
            pos[1]=pos[2];
            pos[2]=0;
        }else
        {
            int L=strlen(str);
            str[L]='0'; // переводим в центы добавляя две буквы '0'
            str[L+1]='0';
            str[L+2]=0;
        }
        istrstream ss(str);
        ss>>summ;
    }
 public:
    Money():summ(0){}
    Money(long s):summ(s){}
    Money(char* str){str2summ();}
    void Input()
    {
        cout << "Enter the amount in dollars with point. End with a dollar sign:" << endl; 
        cin.getline(str,64);
        str2summ();
    }
    void display()
    {
        ostrstream ss(str,100);
        ss<<summ;
        int L=strlen(str);
        str[L+2]=0;
        str[L+1]='$'; // вставляем точку и знак доллара
        str[L]=str[L-1];
        str[L-1]=str[L-2];
        str[L-2]='.';
        cout << str << endl;
    }
};
int main()
{
    Money money;
    money.Input();
    money.display();
    system("pause");
    return 0;
}
1
-=ЮрА=-
Заблокирован
Автор FAQ
25.07.2014, 09:18 #6
Pari, используй возможности С++ в области форматируемого вывода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <string>
#include <sstream>
#include <iomanip>
#include <iostream>
using namespace std;
 
long double ConvStrToLDouble(string str){
    long double val = 0;
    stringstream ss(str);
    ss>>val;
    return val;
}
 
int main(){
    string str = "123456789.12345678901234567";
    cout.precision(str.size());
    long double val = ConvStrToLDouble(str);
    cout<<fixed<<val <<endl;
    cin.get();
    return 0;
}
http://codepad.org/PWNL9HOz
Output:
123456789.123456789013289380818605423
1
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 13:08  [ТС] #7
Цитата Сообщение от Renji Посмотреть сообщение
strMon[j] = number[n++]; заменить на number.push_back(strMon[j]); Массивы C++ не расширяются сами собой. И вообще, вы в strMon вместо number писали.
long double summ =stold(number); заменить на summ =stold(number); иначе результат уходит не в класс, а в локальную переменную.
по выполнению всех этих инструкций все равно работает неверно.

Добавлено через 5 минут
в задании сказано сделать функцию другим способом но спасибо. и я не знаю что значит эта строка, а точнее знак *
Цитата Сообщение от zss Посмотреть сообщение
char *pos;
Добавлено через 22 секунды
я все же хочу довести свой вариант до ума

Добавлено через 20 минут
укажите на ошибку, или что добавить

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "stdafx.h"
#include<iostream>
#include <string>
#include <stdlib.h>
#include <math.h>
using namespace std;
class Money
{
private:
    string strMon;
    long double summ;
public:
    long double mstold()
    {
        cout << "Enter the amount in decimal point. End with a dollar sign" << endl; 
        getline(cin, strMon, '$');
 
        int wlen = strMon.length();
        int n=0;
        string number;
 
        for (int j = 0; j < wlen; j++)
            if (strMon[j] != (','||'$'))
                number.push_back(strMon[j]); ;
        summ = stold(number);    
        return summ;
    }
    void display()const
    {
        cout << "\n" << summ << endl;
    }
};
 
int main()
{
    Money money;
    money.mstold();
    money.display();
    system ("pause");
    return 0;
}
0
zss
Модератор
Эксперт С++
6530 / 6092 / 2006
Регистрация: 18.12.2011
Сообщений: 15,841
Завершенные тесты: 1
25.07.2014, 13:29 #8
Цитата Сообщение от Pari Посмотреть сообщение
char *pos;
pos - указатель на char.
Функция strchr возвращает указатель на найденный символ
и NULL если он не найден.
1
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 14:43  [ТС] #9
пожалуйста, помогите кто-нибудь доделать мою версию программы!
0
Renji
1963 / 1361 / 307
Регистрация: 05.06.2014
Сообщений: 3,893
25.07.2014, 15:29 #10
укажите на ошибку, или что добавить
if (strMon[j] != (','||'$')) - так тоже делать нельзя (','||'$' равно true, сравнение символа с true бессмысленно). Сравнивайте strMon[j] отдельно с запятой, отдельно со знаком доллара.
0
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 15:45  [ТС] #11
Цитата Сообщение от Renji Посмотреть сообщение
if (strMon[j] != (','||'$')) - так тоже делать нельзя (','||'$' равно true, сравнение символа с true бессмысленно). Сравнивайте strMon[j] отдельно с запятой, отдельно со знаком доллара.
как их правильно сравнивать отдельно? напишите пожалуйста выражение.
0
Renji
1963 / 1361 / 307
Регистрация: 05.06.2014
Сообщений: 3,893
25.07.2014, 15:46 #12
strMon[j] != ',' && strMon[j] != '$'
0
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 16:00  [ТС] #13
Цитата Сообщение от Renji Посмотреть сообщение
strMon[j] != ',' && strMon[j] != '$'
если такое написать, то выводит:
вводим к примеру: 1,232,232,232.33$ а выдает: 1.232323е+009.
0
Renji
1963 / 1361 / 307
Регистрация: 05.06.2014
Сообщений: 3,893
25.07.2014, 16:12 #14
если такое написать, то выводит:
вводим к примеру: 1,232,232,232.33$ а выдает: 1.232323е+009.
Правильно выдает, просто в экспоненциальной записи. Пользуйтесь 64 битовым целым или попробуйте поиграться с cout.precision(сколько вам надо знаков). Может, поможет.
0
Pari
40 / 3 / 0
Регистрация: 24.11.2013
Сообщений: 139
25.07.2014, 16:48  [ТС] #15
нашла в учебнике как правильно сделать нормальный вывод, теперь программа работает полностью правильно:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include "stdafx.h"
#include<iostream>
#include <string>
#include <stdlib.h>
#include <iomanip>
using namespace std;
class Money
{
private:
    string strMon;
    long double summ;
public:
    long double mstold()
    {
        cout << "Enter the amount in decimal point. End with a dollar sign" << endl; 
        getline(cin, strMon, '$');
 
        int wlen = strMon.length();
        int n=0;
        string number;
 
        for (int j = 0; j < wlen; j++)
            if (strMon[j] != ',' && strMon[j] != '$')
                number.push_back(strMon[j]); ;
        summ = stold(number);    
        return summ;
    }
    void display()const
    {
        cout << setiosflags (ios::fixed) 
            << setiosflags (ios::showpoint)
            <<setprecision(2)
            << "\n" << summ << endl;
    }
};
 
int main()
{
    Money money;
    money.mstold();
    money.display();
    system ("pause");
    return 0;
}
1
25.07.2014, 16:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2014, 16:48
Привет! Вот еще темы с ответами:

Преобразование из string в double - C++
Вот простой пример демонстрирующий данную проблему: Так работает: #include &lt;iostream&gt; #include &lt;cstdlib&gt; int main() { ...

Преобразование из string в double - C++
Объясните пожалуйста в чем связь между преобразованием данный из string в double и библиотекой русского языка Вот так работает #include...

Преобразование Double в string - C++
Допустим у меня есть число double n = 0.0000000000 мне нужно преобразовать его в строку string s = 0.0000000000. Как это сделать?

Преобразование типов string->double c заданной точностью*? - C++
Есть входящая строка 123456 или 00546.. или любая другая. Как преобразовать в тип double, чтобы на выходе я получил: 123.456 ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru