I was trying to format a matrix using stringstream, setw and setprecision. The code looks like this:
template <typename T>
std::string format(std::vector<T> &a, int m, int n, int lda)
{
    std::stringstream ss;
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            ss << std::setw(6);
            ss << a[i + j * lda];
            ss << std::setprecision(2);
        }
        if (i < m - 1)
            ss << std::endl;
    }
    return ss.str();
}
int main()
{
    const int LDA = 5;
    const int N = LDA;
    std::vector<double> a = {
        6.39, 0.00, 0.00, 0.00, 0.00,
        0.13, 8.37, 0.00, 0.00, 0.00,
        -8.23, -4.46, -9.58, 0.00, 0.00,
        5.71, -6.10, -9.25, 3.72, 0.00,
        -3.18, 7.21, -7.42, 8.54, 2.51};
    std::cout << format(a, N, N, LDA) << std::endl;
    return 0;
}
The output looks like this:
  6.39  0.13  -8.2   5.7  -3.2
     0   8.4  -4.5  -6.1   7.2
     0     0  -9.6  -9.2  -7.4
     0     0     0   3.7   8.5
     0     0     0     0   2.5
- Why are values like -8.2,8.4rounded?
- Why aren't zeros formatted?
I was expecting an output like this:
   6.39   0.13  -8.23   5.71  -3.18
   0.00   8.37  -4.46  -6.10   7.21
   0.00   0.00  -9.58  -9.25  -7.42
   0.00   0.00   0.00   3.72   8.54
   0.00   0.00   0.00   0.00   2.51
How do I format it correctly?
 
    