Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Форматирование денежной строки, как добавить запятые через каждые 3 цифры?

29K
19 ноября 2008 года
EXAngel
29 / / 08.07.2008
Текст программы, и листинг во вложениях.
Среда MVC6. Приложение консольное.

Суть в следующем:
- Вводим число типа double
- Преобразуем его в строку, добавляя знак доллара в начало и запятые через каждые 3 цифры.
- Выводим на экран.

Как это сделать с помощью чистого С++?
Цитата:
#include <iostream>
#include "stdlib.h"
#include <iomanip>

using namespace std;

class money
{
private:
char str[50];
public:

void ldtoms ()
{
const MAX=50;
double num;
char buf[MAX];

cout << "Enter double: ";
cin >> num;
sprintf (buf, "%.3f", num);

str[0] = 36;

for (int i=0; i<strlen(buf); i++)
{
str[i+1] = buf;
}
str='\0';
}

void show()
{
cout << str << endl;
}

};

int main()
{
money m;
m.ldtoms();
m.show();

return 0;
} //end main



Результат работы программы:

Цитата:
Enter double: 1789852.28
$1789852.28

394
20 ноября 2008 года
MegaMozg
317 / / 18.03.2006
зачем считывать данные в double, а потом переводить в строку, когда можно сразу в строку?
что имеется ввиду под "чистым" с++?

примерно так:
Код:
#include<iostream>
#include<string>

using namespace std;

class money
{
    string usd;

public:
    void set(string s);
    string get(){return usd;};
};

void money::set(string s)
{
    usd = '$';
    for(int i = 0; i < s.length(); ++i)
    {
        usd += s;
        if(((i + 1) % 3 == 0) && ((i + 1) != s.length()))usd +=',';
    }
}

int main()
{
    money m;
    string s;
    cin >> s;
    m.set(s);
    cout << m.get();
   
    return 0;
}
29K
21 ноября 2008 года
EXAngel
29 / / 08.07.2008
Цитата:
зачем считывать данные в double, а потом переводить в строку, когда можно сразу в строку?
что имеется ввиду под "чистым" с++?


Преобразование - это условие задачи.
Чистый С++, я имел ввиду без STL и хитрого синтаксиса. Вы как раз так и объяснили, спасибо!

P.S. Бывает на форумах так ответят, что разобрать что это, задача сама по себе :)

29K
27 ноября 2008 года
EXAngel
29 / / 08.07.2008
2MegaMozg
Ты сам пробовал свой код?
Не фунциклирует :)
Цитата:
Enter String: 1789852.26
$178,985,2.2,6


Должно быть:

Цитата:
Enter String: 1789852.26
$1,789,852.26

394
30 ноября 2008 года
MegaMozg
317 / / 18.03.2006
воть:
Код:
#include<iostream>
#include<sstream>
#include<string>

using namespace std;

class money
{
    double num;                                     // значение денежной суммы
    string rep;                                     // строковое представление денежной суммы

    void makeRep();                                 // генерирует строковое представление денежной суммы
public:
    money(double n):num(n){makeRep();};
    double getNum()const{return num;};              // получить значение денежной суммы
    string getRep()const{return rep;};              // получить строковое представление денежной суммы
};

void money::makeRep()
{
    stringstream ss;                                // строковый поток
    string numstr;                                  // здесь будем создавать строковое представление
    int len;                                        // будем хранить кол-во знаков в числе
    int triads;                                     // будем хранить кол-во триад в числе
   
    // преобразование в string
    ss << fixed << num;                             // число в поток; манипулятор fixed, чтоб убрать "е" в больших числах
    ss >> numstr;                                   // из потока в строку
    for(int j = 0; j < 4; ++j)
        numstr.erase(numstr.length() - 1);          // убираем четыре лишних ноля после запятой (у доллара не бывает миллионых долей ;))

    len = numstr.length();                          // вычисляем кол-во знаков в числе
    triads = len / 3;                               // вычисляем кол-во триад в числе

    for(int i = 1; i <= triads; ++i)                // в цикле проходим по всем триадам
    {
        int pos = (len - 3 * i);                    // позиция самого левого символа триады (СЛТ)
        if((pos != 0) && (numstr[pos] != '.'))      // если СЛТ не точка и не самый первый символ числа...
            numstr.insert(pos, ",");                // ...ставим на его место запятую
    }

    numstr.insert(0, "$");                          // добавляем знак доллара в начало
    rep = numstr;                                   // присваем полученную строку чему надо
}

int main()
{
    double n;
    cin >> n;
    money m(n);
    cout << m.getRep() << endl;
    return 0;
}
29K
03 декабря 2008 года
EXAngel
29 / / 08.07.2008
Спасибо за помощь!
Ты оправдываешь свой ник :D

Примеры сработали оба, я просто пересоздал консольный проект "Hello World" со строкой
Цитата:
#include "stdafx.h"


Объясни пж. что это за двоеточие. Незнакомый синтаксис..

Цитата:
public:
money(double n):num(n){makeRep();};
double getNum()const{return num;};
string getRep()const{return rep;};



Конструкторы тоже выносят за пределы класса?

Цитата:
money::money(double n)
{
num = n;
makeRep();
}

394
04 декабря 2008 года
MegaMozg
317 / / 18.03.2006
Почитай книги по языку...
29K
04 декабря 2008 года
EXAngel
29 / / 08.07.2008
:D Ёлки, это же просто конструктор :)
Тупанул с перепугу ...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог