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
填充其余空间时,它会将所有剩余空间打印到终端。如果您仔细查看输出,您可以看到数字开头之前有 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;
这允许终端用空格填充输出,然后用其他空格缓冲您的数字或字符串,最后打印所有对齐的数字。只要确保给你的第二个setw()
足够的空间来容纳大量的数字,如果你期待的话。
试试这里!