Формат cout cout с "right" и setw() для строки и числа с плавающей запятой
Я пытаюсь отформатировать "cout", где он должен отображать что-то вроде этого:
Result $ 34.45
Сумма ($ 34,45) должна быть на правильном указателе с определенным количеством отступов или заканчиваться в определенной позиции столбца. Я пытался с помощью
cout << "Result" << setw(15) << right << "$ " << 34.45" << endl;
Тем не менее, он устанавливает ширину для строки "$ ", а не для строки плюс сумма.
Какой-нибудь совет относительно того, чтобы иметь дело с таким форматированием?
3 ответа
Вам нужно объединить "$ " и значение 34,45 в отдельную строку. Попробуйте вот так:
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;
int main()
{
stringstream ss;
ss << "$ " << 34.45;
cout << "Result" << setw(15) << right << ss.str() << endl;
}
Вы пытаетесь применить модификатор формата к двум аргументам разных типов (строковый литерал и double
), который не может сработать. Чтобы установить ширину для обоих "$ "
и число, вам нужно сначала преобразовать оба в строку. Один из способов был бы
std::ostringstream os;
os << "$ " << 34.45;
const std::string moneyStr = os.str();
std::cout << "Result" << std::setw(15) << std::right << moneyStr << "\n";
Это, по общему признанию, многословно, поэтому вы можете поместить первую часть в вспомогательную функцию. Также, std::ostringstream
форматирование может быть не лучшим выбором, вы также можете взглянуть на std::snprintf
(перегрузка 4).
Альтернативой может быть использование std::put_money
,
#include <iostream>
#include <locale>
#include <iomanip>
void disp_money(double money) {
std::cout << std::setw(15) << std::showbase << std::put_money(money*100.)<< "\n";
}
int main() {
std::cout.imbue(std::locale("en_US.UTF-8"));
disp_money(12345678.9);
disp_money(12.23);
disp_money(120.23);
}
Выход
$12,345,678.90
$12.23
$120.23