выравнивание текста — Как выровнять суммы в долларах, чтобы центы совпадали в C ++?

Моя программа выполняется просто отлично, но мне было интересно, как выровнять вывод, чтобы центы выстраивались в линию, а не в долларах.

Мы начали занятия только пару недель назад, поэтому мы еще не прошли через это. Мой профессор говорит, что пока все в порядке, если они не выровняются, я думаю, что я просто ОКР по этому поводу. Плюс, я думаю, что это выглядит намного чище.

Кроме того, если счет составляет $ 38,40, это будет четыре значащие цифры? Извините, я давно не занимался математикой. В моем выводе я почему-то получаю до пяти значимых цифр. Максимум у меня это четыре. Как бы я это исправить, используя setprecision?

cout << "Bill \t \t   $  " << bill << endl;
cout << "Tax at 10.5% \t \t $"<<tax<< endl;
cout << "Sub-total \t \t $"<<subTotal<< endl;
cout << "Tip at 20% \t \t $"<<tip<< endl;
cout << endl;
cout << "Total Bill \t \t \t $"<<totalBill<< endl;

Как вы видите, я пробовал это с помощью клавиши Escape. Как следует из ответа, я должен использовать setw?

Изменить на 9/10:

Я округлил все суммы в долларах до двух десятичных знаков, кроме счета, и не знаю, как это исправить. Спасибо за всю информацию, которую вы мне дали, но она слишком сложна для того, что мы делаем сейчас, поэтому я просто выровнял вещи вручную. Мне все еще нужно добавить setw, а затем исправить все, как только это там. Я просто спрашиваю, почему счет состоит только из трех цифр. Это, наверное, что-то очень простое, что происходит прямо над моей головой.

 // Declare variables
double bill, tax, subTotal, tip, totalBill;

// Variables
bill = 38.40;
tax = .105;
tip = .20;

// Calculate the tax
tax = bill * .105;

// Calculate sub-total of bill
subTotal = bill + tax;

// Calculate tip
tip = subTotal * .20;

// Calculate total amount of bill
totalBill = subTotal + tip;

cout << "Bill" "         $ " << setprecision(4) << bill << endl;
cout << "Tax at 10.5%" " $ " << setprecision(3) << tax << endl;
cout << "Sub-total" "    $ " << setprecision(4) << subTotal << endl;
cout << "Tip at 20%" "   $ " << setprecision(3) << tip << endl;
cout << endl;
cout << "Total Bill" "   $ " << setprecision(4) << totalBill << endl;

Редактировать: Я починил это. Все хорошо сейчас.

0

Решение

Если вы печатаете деньги, я рекомендую вам взглянуть на C ++ денежный ввод / вывод.
std::put_money гарантирует, что вы соответствуете международным стандартам и печатаете с правильной округлостью / точностью.

Установите локаль std::cout за доллары.
std::showbase решит, печатать ли $,

  //settings for printing as USD
std::cout.imbue(std::locale("en_US.utf8"));
std::cout << std::showbase;

использование станд :: setw а также станд :: влево для форматирования.
Вот пример печати ваших данных:

#include <iostream>
#include <string>
#include <iomanip>

//row data from example
struct Row{
std::string description;
float amount;
};

//function for printing a row
void Print(Row row);

int main(){

//example rows
Row a{"Bill",3840};
Row b{"Tax at 10.5%",403};
Row c{"Sub-total",4243};
Row d{"Tip at 20%",848};
Row e{"Total Bill",5091};

//settings for printing as USD
std::cout.imbue(std::locale("en_US.utf8"));
std::cout << std::showbase;

//format printing
Print(a);
Print(b);
Print(c);
Print(d);
std::cout << '\n';
Print(e);
}

void Print(Row row){
static const int COLUMN_WIDTH{14};
std::cout << std::setw(COLUMN_WIDTH) << std::left << row.description;
std::cout << " " << std::right << std::put_money(row.amount) << '\n';
}

результат:

Bill           $38.40
Tax at 10.5%   $4.03
Sub-total      $42.43
Tip at 20%     $8.48

Total Bill     $50.91
4

Другие решения

Одним из возможных способов является использование setw.

cout<<setw(5)<<4.55<<endl;
cout<<setw(5)<<44.55<<endl;

output:
4.55
44.55

Обновить:
как отметил Джонатан Леффлер, << Оператор сбрасывает ширину, поэтому код обновляется, чтобы показать, что его следует повторить.

1

Я хотел бы сделать что-то вроде:

std::cout << std::setw(15) << std::left << "Bill";
std::cout << std::setw(15) << std::right << std::fixed << std::setprecision(2) << bill << std::endl;

std::cout << std::setw(15) << std::left << "Tax @ 10.5%";
std::cout << std::setw(15) << std::right << std::fixed << std::setprecision(2) << tax << std::endl;

Это устанавливает ширину вывода для каждого «столбца» в 15 символов, поэтому вам не нужно полагаться на вкладки. Все «ярлыки» будут выровнены по левому краю, а все цены будут выровнены по правому краю и напечатаны с точностью до 2 знаков после запятой. Это немного надежнее, чем полагаться на вкладки, где вы не можете контролировать количество используемых символов. Вы не можете сделать правильное обоснование с вкладками.

1
По вопросам рекламы [email protected]