2016-02-15 3 views
1

J'ai essayé d'aligner le code suivant pour les 3 dernières heures sans aucun succès. Quelqu'un pourrait-il me renseigner sur ce que je fais mal? Mon but est d'avoir la chaîne gauche littérale aligné et le droit de variable aligné comme ceci:Un autre problème d'alignement de sortie C++

Loan amount:    $ 10000.00 
Monthly Interest Rate:  0.10% 

Mais ce que je garde geting:

Loan amount:    $ 10000.00 
Monthly Interest Rate: 0.10% 

Et ceci est la version la plus récente de ce J'ai essayé:

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

J'apprécierais vraiment de l'aide.

+0

'right' n'a aucun effet sauf s'il est utilisé avec' setw', par ex. '<< right << (10) << rateMonthly'. –

+0

Comme le montrent les autres réponses (bien que non expliqué pourquoi), 'right' est" sticky "; Vous devez donc définir 'left' à nouveau pour la ligne suivante. En fait tous les manipulateurs sont collants à l'exception de 'setw'. –

+0

Si vous allez entrer dans une mise en forme plus compliquée qui nécessite une justification gauche-droite, vous pouvez écrire votre propre fonction pour cela, qui prend la chaîne de gauche et la chaîne de droite et la largeur comme arguments –

Répondre

2

La largeur de champ setw est défini pour le next item to be output and is reset to 0 afterwards. C'est pourquoi seul le texte est affiché sur 25 caractères et non sur la sortie restante sur la ligne.

Les right et left11 définissent où les caractères de remplissage doivent être placés sur le terrain. Cela signifie qu'il s'applique uniquement au champ courant s'il a une largeur définie. C'est pourquoi la justification n'est pas appliquée aux éléments qui suivent le texte.

Ici vous pour obtenir le 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; 

Si vous voulez que le $ soit à côté du numéro, vous devez vous assurer que le $ et le nombre sont concaténés en un seul objet à la sortie, soit en les regroupant en une seule chaîne, soit en utilisant un format monétaire.

+1

Wow, merci! Comme je l'ai mentionné, j'ai essayé pendant un moment et j'ai essayé de spécifier setw() et gauche-droite deux fois pour une ligne séparément, mais je ne savais pas que cela ne s'applique qu'à l'élément suivant.Je suppose que les signes $ et% ont gâché la sortie. Vous apprenez quelque chose tous les jours je suppose. Merci encore. :) – Vori

1

Voici le live demo, qui devrait produire exactement ce que vous voulez. Il n'y a aucun moyen de définir la précision avec std::to_string(double), c'est pourquoi j'ai créé une petite aide pour le faire.

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, je pense encore celui-ci semble mieux:

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

Je pense qu'il cherche le dernier chiffre du montant à aligner avec le '%' sur la ligne suivante –

-1

Si vous voulez

 
Loan amount:    $ 10000.00 
Monthly Interest Rate:  0.10% 

Si vous ne voulez pas vous embêter avec gauche et à droite, vous pouvez utiliser

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

Vous pouvez nous e ce qui suit

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