cout — Еще одна проблема с выравниванием вывода в C ++

Я пытался выровнять следующий код за последние 3 часа с нулевым успехом. Кто-нибудь может рассказать мне о том, что я делаю неправильно?
Моя цель — выровнять строковый литерал по левому краю, а переменную по правому краю следующим образом:

Loan amount:             $ 10000.00
Monthly Interest Rate:        0.10%

Но это то, что я продолжаю получать:

Loan amount:             $ 10000.00
Monthly Interest Rate:   0.10%

И это самая последняя версия того, что я пробовал:

cout << setw(25) << "Loan amount:" << right << "$ "<< amount << endl;
cout << setw(25) << "Monthly Interest Rate:"<< right<< rateMonthly << "%" << endl;

Я был бы очень признателен за помощь.

1

Решение

setw ширина поля определяется для следующий элемент для вывода и сбрасывается на 0 впоследствии. Вот почему на 25 символов отображается только текст, а не оставшийся вывод в строке.

right а также left Выравниватель определяет, где символы заполнения должны быть помещены в поле. Это означает, что оно применяется только к текущему полю, если оно имеет определенную ширину. Вот почему обоснование не применяется к пунктам, следующим за текстом.

Здесь вы можете получить ожидаемый результат:

cout <<setw(25)<< left<< "Loan amount:" <<  "$ "<< setw(10)<<right << amount << endl;
cout <<setw(25)<< left << "Monthly Interest Rate:"<<"  "<<setw(10)<<right<< rateMonthly << " %" << endl;

Если вы хотите, чтобы $ был рядом с числом, вы должны убедиться, что $ и число объединены в один объект для вывода, либо сложив их в одну строку, либо используя денежный формат.

2

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

Вот живое демо, который должен выводить именно то, что вы хотите.
Там нет никакого способа установить точность с std::to_string(double)Вот почему я создал маленький помощник, чтобы сделать это.

auto to_string_precision(double amount, int precision)
{
stringstream stream;
stream << fixed << setprecision(precision) << amount;
return stream.str();
};

cout << setw(25) << left << "Loan amount:" << setw(10) << right << ("$ " + to_string_precision(amount, 2)) << endl;
cout << setw(25) << left << "Monthly Interest Rate:" << setw(10) << right << (to_string_precision(rateMonthly, 2) + "%") << endl;

Альтернатива, я все еще думаю, что этот выглядит лучше:

cout << setw(25) << left << "Loan amount:" << "$ " << amount << endl;
cout << setw(25) << left << "Monthly Interest Rate:" << rateMonthly << "%" << endl;
1

Если ты хочешь

Сумма кредита: $ 10000,00
Ежемесячная процентная ставка: 0,10%

Если вы не хотите беспокоиться о левом и правом вы можете использовать

cout  << "Loan amount:"  <<setw(25)<< "$ "<< amount << endl;
cout  << "Monthly Interest Rate:"<< setw(19)<< rateMonthly << "%" << endl;

Вы можете использовать следующее

cout << setw(25) << left << "Loan amount:"<< "$ " << amount << endl;
cout << setw(28) << left << "Monthly Interest Rate:" << rateMonthly << "%" <<endl;
-1
По вопросам рекламы [email protected]