2016-10-19 19 views
0

Допустим, что я хочу, чтобы напечатать что-то простое, как эту таблицу:Как я могу форматировать ширину в puttime?

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

Я хотел бы, чтобы выполнить это, как:

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; 

К сожалению puttime, кажется, не позволяет мне использовать поле флаги в полях формата. К сожалению, puttime не играет роли с setw.

Мое единственное, что можно сделать strftime, а затем использовать его с setw?

ответ

1

Вот header-only library что уважает манипуляторы ввода/вывода:

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

Вы можете попробовать это самостоятельно, вставив приведенный выше код в этом 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 
1

Ниже будет также работать

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