2016-09-10 5 views
0

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

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

Кроме того, если счет составляет 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; 

Как вы видите, я пытаюсь использовать эту вкладку. Как следует из ответа, я должен использовать 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; 

Edit: I "фиксированный" его. Все хорошо сейчас.

+1

Вопросы по stackoverflow.com должны включать в себя весь полный и уместный вопрос в самом сообщении, а не ссылку на какой-либо внешний веб-сайт, который может перестать работать в любое время, делая вопрос бессмысленным. Вам необходимо отредактировать свой вопрос, удалить эту ссылку и заменить ее соответствующей информацией. Кроме того, вопросы формы «как мне изменить свой код, чтобы сделать X вместо», очевидно, должны показывать код, если вы не готовы ждать, пока все наши экстрасенсы вернутся с обеденного перерыва, и смогут посмотреть ваш код в чтобы мы могли понять, что с этим поделать. –

+0

Минус ненужный сарказм, спасибо. Я новичок, и я попытался сделать это без ссылки, но это не позволило мне. Я отредактирую его. Кроме того, я не думал, что нужно иметь код, так как он выполнен просто отлично, но я вижу, что вы говорите. –

+0

@SamVarshavchik Я обожаю ваш комментарий. Слишком часто возникает неприятный «этот вопрос низкого качества и должен быть закрыт». Вместо этого ты заставил меня улыбнуться. – Matt

ответ

1

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

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

output: 
4.55 
44.55 

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

+0

Хорошо, спасибо. Я посмотрю в нашей книге, чтобы узнать, как она используется. Я только посмотрел setprecision. –

+0

У вас все еще есть проблемы с выравниванием, если вам нужна ширина 10, скажем. Первое число будет иметь такую ​​ширину; второй - нет. Это нормально работает с номерами, выбранными здесь, но меняет 44.55 на -44.55 или 444.55, и у вас будут проблемы с выравниванием. –

+0

@JonathanLeffler, ты прав, пропустил второй сет! – fireant

4

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

Укажите местонахождение std::cout для USD.
std::showbase решит, следует ли печатать $.

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

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

#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 
+0

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

+0

@Alexa проблем нет. Я хотел оставить описательный ответ о том, как это должно быть сделано для производственного кода. Это вполне может быть излишним для школьного задания. –

+0

Да, это все еще приятно знать для будущего использования. Я определенно вернусь к этому, когда мы доберемся так далеко. –

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 символов, поэтому вам не нужно полагаться на вкладки.Все «ярлыки» останутся оправданными, и все цены будут правильно обоснованы и распечатаны до двух знаков после запятой. Это немного более устойчиво, чем полагаться на вкладки, где у вас нет контроля над тем, сколько символов используется. Вы не можете сделать правильное обоснование с помощью вкладок.