多输入和美元符号的iomanip格式 - C ++

时间:2016-09-18 02:40:54

标签: c++ formatting alignment

我的代码产生了一些问题。

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

1 个答案:

答案 0 :(得分:0)

您必须分两步完成此操作。

  1. 仅使用cart[i]*prices[i]操纵器将美元金额(std::ostringstream)格式化为setprecision。没有最低setw,所以你得到的是格式化的金额。使用std::ostringstream

  2. str()获取字符串表示形式
  3. 通过使用从str()返回的字符串的长度,您可以计算定位&#39; $&#39;所需的填充量。

  4. 您将计算此字段的填充,而不是固定的setw(35)。粗略估计,这可能是:

    << setw(42-amount.length()) << left << "/UNIT:" << "$" << amount << std::endl;
    

    其中amount是您在步骤1中获得的格式化std::string。通过这种方式,此处的宽度将自动调整,以便为amount提供适当的空间。

    这本身不会调整行开头的单位数,也就是可变长度。但是在正确处理amount之后,您应该能够以相同的方式弄清楚如何解决这个问题。