2014-09-19 84 views
2

我很难对齐十进制值。我很确定它是正确对齐和setprecision/fixed的组合,但它似乎没有工作。我知道关于这个主题的其他问题已经被提出,但是我还没有找到明确的解决方案来获得一堆列(独特的cout语句来对齐)。C++ 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; 

这是什么样子:
enter image description here

这是我想它太像:
enter image description here

+1

“Totla收集” – 2014-09-19 15:39:32

回答

1

你在“$”上设置宽度,使它们很好地对齐。但是你也需要为它们自己设定值。我在每个fixed之前添加了一个setw(8),并且它们很好地对齐,除了最后一个具有left而不是right。您可能需要不同的宽度值,但每行应该相同。

理想的解决方案是使用std::put_money(通过您的评论可以看出您不能,但也许这会帮助其他人阅读此答案)。我已经增加了美元金额,说明千位分隔符和固定的一个bug或两个:

#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; 
} 

我得到这样的输出:

 
Total Collected: $10,000.00 
Sales:    $9,433.96 
Country Sales Tax: $188.68 
State Sales Tax:  $377.36 
Total Sales Tax:  $566.04 
+0

我想你的建议,它的工作。但我不确定发生了什么。我真的很希望$$和美元之间没有空格。使用您的解决方案,它运作良好,除非我将美元符号移动到变量之前,然后全部搞砸了。 – YelizavetaYR 2014-09-19 14:33:35

+0

@YelizavetaYR:我想你应该试试['std :: put_money'](http://en.cppreference.com/w/cpp/io/manip/put_money)。我正在做一个例子。 – 2014-09-19 14:41:24

+0

谢谢 - 是的,我知道那个,但被告知不用put_money就可以解决这个难题。困难在于如何将小数对齐,以便将字符串/和变量行与十进制数组合使用。 – YelizavetaYR 2014-09-19 14:44:22