Список C++ cout с десятичными знаками, выровненными с использованием setw(x), а не 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

person Andrew Medina    schedule 06.09.2019    source источник
comment
Попробуйте также добавить ширину для значений второго столбца, скажем, setw(7).   -  person Fred Larson    schedule 06.09.2019
comment
Спасибо, @FredLarson   -  person Andrew Medina    schedule 07.09.2019


Ответы (1)


Когда вы используете std::internal для заполнения остального пространства перед печатью, он напечатает все оставшееся пространство на терминале. Если вы внимательно посмотрите на свой вывод, вы увидите, что перед началом ваших чисел (или вашего имени, если это первая строка) есть 25 символов.

Вы можете обойти это, рассчитав длины строк, которые вы будете печатать, и вычтя их из вызова setw(), но это усложняется для чисел с фиксированной точностью и удвоений. К счастью, есть более простой способ!

Как отметил Фред Ларсон в комментариях, отличный способ обойти это — добавить второй setw() и std::internal после вашего первого вызова 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() имеет достаточно места для размещения больших чисел, если вы их ожидаете.

Попробуйте здесь!

person Nick Reed    schedule 06.09.2019
comment
@AndrewMedina Рад помочь, все реквизиты Фреду Ларсону за его предложение. Пожалуйста, не забудьте принять ответ, если он решит ваш вопрос. Добро пожаловать в StackOverflow! - person Nick Reed; 07.09.2019