2013-06-22 47 views
0

當我嘗試列出所有項目的詳細信息時,每個項目都使用不同的行 ,並且存在行編號問題。我希望在行號後面立即加上括號。謝謝。動態對齊問題

alignment issue

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

回答

1

這樣做的唯一辦法,據我所看到的,是通過列表來走,並找出「多久這個得到」對於每一列,並跟蹤每一列的最大值是多少。然後在列寬中使用這些值。

字符串很容易找到長度,因爲它們有一個長度。數字更難 - 基本上,你必須採取將它除以十的方法,直到它爲零(這意味着浮點數的整數部分 - 大概是這樣的事情,你有一個固定數量的小數或使用「整數以美分表示價格「或其他)。您也許可以使用std::tostring生成長度也爲一個字符串。或者,您可以使用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; 
} 
+0

u能告訴我如何編寫代碼呢?謝謝。 – zzz