2016-02-15 2 views
1

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

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; 

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

+0

'right' не действует, если не используется в сочетании с' setw', например. '<< right << setw (10) << rateMonthly'. –

+0

Как видно из других ответов (хотя и не объяснено, почему), 'right' является« липким »; поэтому вам нужно снова установить «left» для следующей строки. На самом деле все манипуляторы являются липкими, за исключением 'setw'. –

+0

Если вы собираетесь использовать более сложное форматирование, которое требует выравнивания влево-вправо, вы можете написать свою собственную функцию для этого, которая берет левую строку и правильную строку и ширину в качестве аргументов –

ответ

2

Ширин setw поля определяются для next item to be output and is reset to 0 afterwards. Вот почему только текст отображается на 25 символах, а не на оставшемся выходе на линии.

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

Здесь для получения expected result:

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

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

+1

Вау, спасибо! Как я уже упоминал, я пытался какое-то время, и я попробовал указать setw() и left-right дважды для отдельной строки, но я не знал, что это применимо только к следующему элементу.Я думаю, что знаки $ и% испортили выход. Вы узнаете что-то повседневное, я думаю. Еще раз спасибо. :) – Vori

1

Вот live demo, который должен выводить именно то, что вы хотите. Невозможно установить точность с помощью 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; 

Alternative, я до сих пор считаю, что это один выглядит лучше:

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

Я думаю, что он ищет последнюю цифру суммы, чтобы соответствовать «%» на следующей строке –

-1

Если вы хотите

 
Loan amount:    $ 10000.00 
Monthly Interest Rate:  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; 
Смежные вопросы