0

当我尝试列出所有项目的详细信息时,每个项目都在带有行号的不同行上,它存在对齐问题。我想立即将右括号放在行号之后。谢谢。

对齐问题

cout << left
    << setw(20) << "     Item Code" 
    << setw(50) << "Description"
    << setw(20) << "Quantity on hand"
    << setw(20) << "Cost price" 
    << setw(20) << "Selling price(RM)" 
    << setw(20) << "Status" 
    << setw(20) << "Discount(%)" << endl;

for (int i = 0; i <= 100; i++)//counter - 1; i++) 
{
    cout << left
        << setw(2)  << i + 1 << ")"
        << setw(20) << item[i].getItemCode() 
        << setw(50) << item[i].getDescription() 
        << setw(20) << item[i].getQuantity() 
        << setw(20) << item[i].getCostPrice() 
        << setw(20) << item[i].getSellPrice() 
        << setw(20) << item[i].getStatus() 
        << setw(20) << item[i].getDiscount() << endl;
}
4

1 回答 1

1

据我所知,这样做的唯一方法是遍历列表并找出每列的“这需要多长时间”,并跟踪每列的最大值。然后在列宽中使用这些值。

字符串很容易找到长度,因为它们本身就有长度。数字更难 - 基本上,你必须采取将它除以十直到它为零的方法(这意味着浮点数的整数部分 - 大概对于这样的东西,你有固定的小数位数或使用“整数以美分表示价格”或类似的)。您也可以使用std::tostringto 生成具有长度的字符串。或者您可以使用stringstream输出到字符串 - 单个项目或整个批次,然后计算某个分隔符之间的字符数[在正常输出中不会出现,或者很容易出错!]

例如,使用一个简单的结构:

struct Data
{
    int x;
    string y;
    float z;
}

...
Data d[10];
int maxLen[3] = { 0 };
...  // code fills in data with stuff. 

for(int i = 0; i < 10; i++)
{
    stringstream ss; 
    ss << left << d[i].x << " " << d[i].y << " " << fixed << setprecision(2) << d[i].z;
    // Number of elements = 3. 
    for(int j = 0; j < 3; j++) 
    {
       string s;
       ss >> s;
       if (s.length() > maxLen[j])
         maxLen[j] = s.legnth;
    }
}

...

for(int i = 0; i < 10; i++)
{
    cout << left << setw(3) i << ": " 
         << setw(maxLen[0]+1) << d[i].x
         << setw(maxLen[1]+1) << d[i].y
         << setw(maxLen[2]+1) << fixed << setprecision(2) << d[i].z << endl;
}
于 2013-06-22T16:50:41.927 回答