How can I Format Width in puttime?

2019-09-13 01:28发布

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?

2条回答
叼着烟拽天下
2楼-- · 2019-09-13 01:47

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
查看更多
Evening l夕情丶
3楼-- · 2019-09-13 02:05

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;
    }
查看更多
登录 后发表回答