使用 setw(x) 而非 put_money 对齐小数点的 C++ cout 列表

C++ cout list with decimals aligned using setw(x) not put_money

C++ 代码运行良好,但当前向右输出值但向左对齐且未在小数点上对齐。无法使用 put_money,我错过了什么?

尝试使用 fprint 和 put_money,与同学确认我们应该使用 setw(x)。

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;


int main()
{
const double taxRate = 0.09;
const double laborCPH = 35.0; //where CPH is Cost Per Hour
double costParts;
double costLabor;
double totalTax;
double totalDue;
string name;
double laborHours;

     cout << "What is your name? ";
     cin >> name;

     cout << "How many hours of labor needed? ";
     cin >> laborHours;

costLabor = laborHours * laborCPH;

     cout << "What was the cost of the parts and supplies? ";
     cin >> costParts;
     cout << endl << endl;


totalTax = costParts * taxRate;

totalDue = costParts + totalTax + costLabor;

     cout.precision(2);
     cout << setw(25) << left << "Customer Name " << fixed << right << internal << name << endl;
     cout << setw(25) << left << "Hours of Labor " << fixed << right << internal  << laborHours << endl;
     cout << setw(25) << left << "Cost for Labor " << fixed << right << internal  << costLabor << endl;
     cout << setw(25) << left << "Parts and Supplies " << fixed << right << internal  << costParts << endl;
     cout << setw(25) << left << "Tax " << fixed << right << internal  << totalTax << endl;
     cout << setw(25) << left << "Total Amount Due " << fixed << right << internal  << totalDue << endl;

 return 0;
}

实际输出:

What is your name? Jones
How many hours of labor needed? 4.5
What was the cost of the parts and supplies? 97


Customer Name            Jones
Hours of Labor           4.50
Cost for Labor           157.50
Parts and Supplies       97.00
Tax                      8.73
Total Amount Due         263.23

期望的输出:

What is your name? Jones
How many hours of labor needed? 4.5
What was the cost of the parts and supplies? 97


Customer Name            Jones
Hours of Labor             4.50
Cost for Labor           157.50
Parts and Supplies        97.00
Tax                        8.73
Total Amount Due         263.23

当你在打印前使用std::internal填充剩余的space时,它将打印剩余space的全部到终点站。如果您仔细查看您的输出,您会看到在您的数字(或者您的姓名,如果它是第一行)开始之前有 25 个字符。)

您可以通过计算要打印的字符串的长度并从 setw() 调用中减去该长度来解决这个问题,但是对于固定精度的浮点数和双精度数来说,这会变得很复杂。幸运的是,有一种更简单的方法!

正如 Fred Larson 在评论中指出的那样,解决此问题的一个好方法是在您第一次调用 std::internal 之后添加第二个 setw()std::internal,如下所示:

     cout.precision(2);
     cout << setw(20) << left << "Customer Name " << fixed << right << internal << setw(7) << internal << name << endl;
     cout << setw(20) << left << "Hours of Labor " << fixed << right << internal << setw(7) << internal << laborHours << endl;
     cout << setw(20) << left << "Cost for Labor " << fixed << right << internal << setw(7) << internal << costLabor << endl;
     cout << setw(20) << left << "Parts and Supplies " << fixed << right << internal << setw(7) << internal << costParts << endl;
     cout << setw(20) << left << "Tax " << fixed << right << internal << setw(7) << internal << totalTax << endl;
     cout << setw(20) << left << "Total Amount Due " << fixed << right << internal  << setw(7) << internal << totalDue << endl;

这允许终端用 spaces 填充输出,然后用额外的 spaces 缓冲您的数字或字符串,最后打印所有对齐的数字。只要确保给你的第二个 setw() 足够的 space 来容纳大量的人,如果你期待他们的话。

Try it here!