Формат 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
Другие вопросы по тегам