C ++ cout десятичное выравнивание

Я с трудом выравниваю десятичные значения. Я уверен, что это сочетание правильного выравнивания и setprecision / fixed, но, похоже, оно не работает. Я знаю, что задавались другие вопросы по этой теме, но я не нашел четкого решения для получения группы столбцов (уникальные операторы cout для выравнивания).

Это кусок моего кода:

double total_collect, sales, country_tax, state_tax, total_tax;
const double STATE_TAX_RATE = 0.04, COUNTRY_TAX_RATE = 0.02;

// Compute taxes
total_collect = 100;
sales = 100 / 1.06 ;
country_tax = sales * COUNTRY_TAX_RATE;
state_tax = sales * STATE_TAX_RATE;
total_tax = country_tax + state_tax;

//Display

cout << setiosflags(std::ios::right) ;

cout << "Totla Collected: " << setw(7) << "$ " << fixed << setprecision(2) << right << total_collect << endl;
cout << "Sales: " << setw(17) << "$ "  << fixed << setprecision(2) << right << sales  << endl;
cout << "Country Sales Tax: " << setw(5) << "$ " << fixed << setprecision(2) << right << country_tax  << endl;
cout << "State Sales Tax: " << setw(7) << "$ "  << fixed << setprecision(2) << right << state_tax << endl;
cout << "Total Sales Tax: " << setw(7) << "$ " << fixed << setprecision(2) << left  << total_tax << endl << endl;

Вот как это выглядит:
введите описание изображения здесь

Это то, что я бы тоже хотел:
введите описание изображения здесь

2

Решение

Вы устанавливаете ширину на «$», которая хорошо их выравнивает. Но вам также нужно установить его для самих ценностей. Я добавил setw(8) перед каждым fixed и это выровняло их хорошо, за исключением последнего, который имеет left вместо right, Возможно, вам понадобится другое значение ширины, но оно должно быть одинаковым для каждой строки.

Идеальным решением было бы использовать std::put_money (Я вижу по вашему комментарию, что вы не можете, но, возможно, это поможет кому-то еще прочитать этот ответ). Я увеличил суммы в долларах для иллюстрации разделителя тысяч и исправил одну или две ошибки:

#include <locale>
#include <iostream>
#include <iomanip>

int main()
{
double total_collect, sales, country_tax, state_tax, total_tax;
const double STATE_TAX_RATE = 0.04, COUNTRY_TAX_RATE = 0.02;
const auto TAX_WIDTH = 10;
const auto LABEL_WIDTH = 19;

// Compute taxes
total_collect = 10000;
sales = total_collect / 1.06 ;
country_tax = sales * COUNTRY_TAX_RATE;
state_tax = sales * STATE_TAX_RATE;
total_tax = country_tax + state_tax;

//Display
std::cout.imbue(std::locale("en_US.utf8"));
std::cout << std::setw(LABEL_WIDTH) << std::left << "Total Collected: "<< std::setw(TAX_WIDTH) << std::right << std::showbase
<< std::put_money(total_collect * 100.0) << std::endl;
std::cout << std::setw(LABEL_WIDTH) << std::left << "Sales: "<< std::setw(TAX_WIDTH) << std::right << std::showbase
<< std::put_money(sales * 100.0) << std::endl;
std::cout << std::setw(LABEL_WIDTH) << std::left << "Country Sales Tax: "<< std::setw(TAX_WIDTH) << std::right << std::showbase
<< std::put_money(country_tax * 100.0) << std::endl;
std::cout << std::setw(LABEL_WIDTH) << std::left << "State Sales Tax: "<< std::setw(TAX_WIDTH) << std::right << std::showbase
<< std::put_money(state_tax * 100.0) << std::endl;
std::cout << std::setw(LABEL_WIDTH) << std::left << "Total Sales Tax: "<< std::setw(TAX_WIDTH) << std::right << std::showbase
<< std::put_money(total_tax * 100.0) << std::endl << std::endl;
}

Я получаю этот вывод:

Всего собрано: $ 10,000.00
Продажи: 9 433,96 $
Налог с продаж страны: $ 188,68
Государственный налог с продаж: $ 377,36
Общий налог с продаж: $ 566,04
1

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


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