0

我正在尝试制作收据,并且总是希望“k​​g”在重量之后是一个空格,并且在“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、$、$)

4

1 回答 1

0

OP怀疑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

Live Demo on coliru

(OP她/他自己在问题中公开了一个可能的解决方案。)

于 2019-04-18T14:30:02.207 回答