2

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
4

1 回答 1

1

当您在打印前使用填充剩余空间时,它会将所有剩余空间std::internal打印到终端。如果您仔细查看您的输出,您会看到数字开头之前有 25 个字符(如果是第一行,则为您的姓名。)

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

正如 Fred Larson 在评论中指出的那样,解决这个问题的一个好方法是在你第一次调用之后添加第二setw()个:std::internalstd::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()如果您期望它们,请确保给您的第二个足够的空间来容纳大量数字。

在这里试试!

于 2019-09-06T20:47:33.537 回答