How can I Format Width in puttime?

2019-09-13 01:06发布

问题:

Let's say that I want to print something simple like this table:

January   1
February  2
March     3
April     4
May       5
June      6
July      7
August    8
September 9
October   10
November  11
December  12

I'd like to accomplish this like:

for(tm i{ 0, 0, 0, 1, 0 }; i.tm_mon < 12; ++i.tm_mon) cout << put_time(&i, "%-9B") << i.tm_mon + 1 << endl;

Unfortunately puttime doesn't seem to allow me to use field flags in it's format fields. Additionally this puttime doesn't seem to play nice with setw.

Is my only option to do strftime and then use that with setw?

回答1:

Here is a header-only library that respects the I/O manipulators:

#include "date.h"
#include <iomanip>
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std;
    auto m = jan;
    do
    {
        cout << left << setw(10) << format("%B", sys_days{m/1/1}) << right
             << unsigned(m) << '\n';
    } while (++m != jan);
}

You can try this out yourself by pasting the above code into this wandbox link.

January   1
February  2
March     3
April     4
May       5
June      6
July      7
August    8
September 9
October   10
November  11
December  12


回答2:

The following will also work

for(tm i{ 0, 0, 0, 1, 0 }; i.tm_mon < 12; ++i.tm_mon)
    {
        std::stringstream oss;
        oss << std::put_time(&i, "%B");
        string str = oss.str();
        cout << std::setiosflags(std::ios::left) << setw( 10 )  << str << setw( 2 ) << i.tm_mon + 1 << endl;
    }