我的代码产生了一些问题。
Apples
10 @ 0.98/UNIT: $9.80
Bananas
1 @ 1.29/UNIT: $1.29
Flank Steak
1 @ 8.82/UNIT: $8.82
Chocolate Ice Cream
1 @ 3.23/UNIT: $3.23
Gym Bag
1 @ 23.12/UNIT: $23.12
ORDER TOTAL:************************************$46.26
我的问题是总计的小数位数与附加的美元符号对齐。我应该能够使用原始setw()代码和右对齐,左对齐,但我不确定如何在不得到$和实际数值之间的空格的情况下去做。
这是我到目前为止所得到的......
void printReceipt(const int cart[], const string productName[], const double prices[], int productCount){
double orderTotal = 0;
for (int i = 0; i < productCount; i++){ //Loop for output of receipt
if (cart[i] != 0){ //Will not output for item not ordered.
cout << productName[i] << endl;
cout << fixed << setprecision(2)
<< setw(3) << left << cart[i]
<< setw(3) << " @ " //Formatting for receipt print
<< setw(6) << prices[i]
<< setw(35) << left << "/UNIT:" << "$"
<< setw(6)<< right << (cart[i] * prices[i]) << endl;
orderTotal = orderTotal + (cart[i] * prices[i]);
}}
cout << fixed << setfill('*') << setw(47)<< left << "ORDER TOTAL:";
cout << setfill(' ') << "$" << setw(6) << right << setprecision(2) << orderTotal;
}
当前输出如下
Apples
5 @ 0.98/UNIT: $ 4.90
Bananas
5 @ 1.29/UNIT: $ 6.45
Flank Steak
5 @ 8.82/UNIT: $ 44.10
Chocolate Ice Cream
5 @ 3.23/UNIT: $ 16.15
Gym Bag
5 @ 23.12/UNIT: $115.60
ORDER TOTAL:***********************************$187.20
答案 0 :(得分:0)
您必须分两步完成此操作。
仅使用cart[i]*prices[i]
操纵器将美元金额(std::ostringstream
)格式化为setprecision
。没有最低setw
,所以你得到的是格式化的金额。使用std::ostringstream
str()
获取字符串表示形式
通过使用从str()
返回的字符串的长度,您可以计算定位&#39; $&#39;所需的填充量。
您将计算此字段的填充,而不是固定的setw(35)
。粗略估计,这可能是:
<< setw(42-amount.length()) << left << "/UNIT:" << "$" << amount << std::endl;
其中amount
是您在步骤1中获得的格式化std::string
。通过这种方式,此处的宽度将自动调整,以便为amount
提供适当的空间。
这本身不会调整行开头的单位数,也就是可变长度。但是在正确处理amount
之后,您应该能够以相同的方式弄清楚如何解决这个问题。