формат cout cout с «right» и setw () для строки и числа с плавающей запятой - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь отформатировать 'cout', где должно отображаться что-то вроде этого:

Result       $ 34.45

Сумма (34,45 $) должна быть в правильном индексе с определенным количеством отступов или заканчиваться наопределенная позиция столбца.Я попытался использовать

cout << "Result" << setw(15) << right << "$ " << 34.45" << endl;

Однако, он устанавливает ширину для строки "$", а не для строки плюс сумма.

Любой совет по поводу такого форматирования?

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Вам нужно объединить "$" и значение 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;
}
0 голосов
/ 03 декабря 2018

Альтернативой может быть использование 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
0 голосов
/ 03 декабря 2018

Вы пытаетесь применить модификатор формата к двум аргументам разных типов (строковый литерал и 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).

...