Взаимодействие между setw и символом двойной кавычки - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь сделать квитанцию, и я хочу, чтобы «kg» было ОДНОМ ПРОБЛЕМ после веса, а также «$» непосредственно перед «costperkg» и «totacost». Первоначально, используя setw для форматирования вывода, могне заставить его работать, сделал это с помощью ostringstream.Могу ли я кто-нибудь объяснить, почему нажатие строки двойной кавычки не работает?

Это не работает:

int main()
{
string item = "A" ;
double weight = 2.00 ;
double costperkg = 1.98 ;
double totalcost = 3.96 ;

cout << fixed << showpoint << setprecision(2);

cout << setw(14) << left << "ITEM" << setw(16) << "WEIGHT" << setw(18) << "COST/kg" 
<< setw(14) << "COST" << endl ;

cout << setw(14) << left << item << setw(16) << weight << "kg" << setw(18) << "$" 
<< costperkg << setw(14) << "$" << totalcost << endl << endl ;
}

Это работает:

ostringstream streamweight, streamcostperkg, streamtotalcost;
    streamweight << fixed << showpoint << setprecision(2) << weight ;
    streamcostperkg << fixed << showpoint << setprecision(2) << costperkg ;
    streamtotalcost << fixed << showpoint << setprecision(2) << totalcost ;

    string strweight = streamweight.str() + " kg" ; 
    string strcostperkg = "$" + streamcostperkg.str() ;
    string strtotalcost = "$" + streamtotalcost.str() ;


    cout << setw(14) << left << item << setw(16) << strweight << setw(18) << strcostperkg 
<< setw(14) << strtotalcost << endl << endl ;

Ожидаемыйрезультат: ITEM WEIGHT COST/kg COST A 2.0 kg $1.98 $3.96 Что я получил вместо этого: ITEM WEIGHT COST/kg COST A 2.00 kg$ 1.98$ 3.96

Почему не работает setw?а также для тех, кто просматривает по телефону, первый символ первой и второй жизни каждого слова должен быть выровнен по первой букве (A, 2, $, $)

1 Ответ

0 голосов
/ 18 апреля 2019

ОП подозревал, что std::setw() не работает. ИМХО, OP не знает, что setw() делает именно то, что ожидалось, но форматирование учитывает также и манипулятор std::left, который делает все после вывода выровненным влево. (Выравнивание по левому краю вступает в силу только в сочетании с setw().)

Пример:

#include <iostream>
#include <iomanip>

// the rest of sample
int main()
{
  std::cout << '|' << std::setw(10) << 2.0 << "|kg" << '\n';
  std::cout << std::left << '|' << std::setw(10) << 2.0 << "|kg" << '\n';
  // done
  return 0;
}

Выход:

|         2|kg
|2         |kg

Демонстрация в реальном времени на coliru

(Возможное исправление раскрыто в вопросе самим О.П.)

...