#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;
}
Форматирование денежной строки, как добавить запятые через каждые 3 цифры?
Среда 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
#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
$1789852.28
зачем считывать данные в double, а потом переводить в строку, когда можно сразу в строку?
Цитата:
зачем считывать данные в double, а потом переводить в строку, когда можно сразу в строку?
что имеется ввиду под "чистым" с++?
что имеется ввиду под "чистым" с++?
Преобразование - это условие задачи.
Чистый С++, я имел ввиду без STL и хитрого синтаксиса. Вы как раз так и объяснили, спасибо!
P.S. Бывает на форумах так ответят, что разобрать что это, задача сама по себе :)
Ты сам пробовал свой код?
Не фунциклирует :)
Цитата:
Enter String: 1789852.26
$178,985,2.2,6
$178,985,2.2,6
Должно быть:
Цитата:
Enter String: 1789852.26
$1,789,852.26
$1,789,852.26
Код:
#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;
}
#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;
}
Ты оправдываешь свой ник :D
Примеры сработали оба, я просто пересоздал консольный проект "Hello World" со строкой
Цитата:
#include "stdafx.h"
Объясни пж. что это за двоеточие. Незнакомый синтаксис..
Цитата:
public:
money(double n):num(n){makeRep();};
double getNum()const{return num;};
string getRep()const{return rep;};
money(double n):num(n){makeRep();};
double getNum()const{return num;};
string getRep()const{return rep;};
Конструкторы тоже выносят за пределы класса?
Цитата:
money::money(double n)
{
num = n;
makeRep();
}
{
num = n;
makeRep();
}
Почитай книги по языку...
Тупанул с перепугу ...