zzz
zzz

Reputation: 161

Dynamic alignment issue

When I try to list details of all items, each on a different line with line numbering, there is alignment issue on it. I want instantly put the close bracket after the line numbering. Thanks.

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

Upvotes: 0

Views: 682

Answers (1)

Mats Petersson
Mats Petersson

Reputation: 129464

The only way of doing this, as far as I can see, is to walk through the list and find out "how long does this get" for each of the columns, and track what the largest is for each of the columns. Then use those values in the column width.

Strings are easy to find the length of, since they have a length as such. Numbers are harder - basically, you have to either take the approach of dividing it by ten down until it's zero (this means the integer part of floating point numbers - presumably for something like this, you have a fixed number of decimals or use "integeer to represent prices in cents" or some such). You may be able to use the std::tostring to produce as string that has a length too. Or you can use stringstream to output to a string - either individual items, or the whole lot and then count the number of characters between some separator character [that doesn't occur in the normal output, or things go wrong pretty easily!]

Example, using a simple struct:

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

Upvotes: 1

Related Questions