Эквивалент% 02d с std :: stringstream? - PullRequest
56 голосов
/ 15 мая 2010

Я хочу вывести целое число в std::stringstream с эквивалентным форматом printf s %02d. Есть ли более простой способ добиться этого, чем:

std::stringstream stream;
stream.setfill('0');
stream.setw(2);
stream << value;

Можно ли передавать потоковые флаги какого-либо формата на stringstream, что-то вроде (псевдокод):

stream << flags("%02d") << value;

Ответы [ 4 ]

71 голосов
/ 15 мая 2010

Вы можете использовать стандартные манипуляторы из <iomanip>, но не существует аккуратного манипулятора, который бы одновременно выполнял fill и width:

stream << std::setfill('0') << std::setw(2) << value;

Нетрудно написать собственный объект, который при вставке в поток выполнял обе функции:

stream << myfillandw( '0', 2 ) << value;

1010 * Е.Г. *

struct myfillandw
{
    myfillandw( char f, int w )
        : fill(f), width(w) {}

    char fill;
    int width;
};

std::ostream& operator<<( std::ostream& o, const myfillandw& a )
{
    o.fill( a.fill );
    o.width( a.width );
    return o;
}
9 голосов
/ 15 мая 2010

Вы не можете сделать это намного лучше в стандартном C ++. В качестве альтернативы вы можете использовать Boost.Format:

stream << boost::format("%|02|")%value;
9 голосов
/ 15 мая 2010

Вы можете использовать

stream<<setfill('0')<<setw(2)<<value;
1 голос
/ 24 ноября 2017

Возможно ли передавать какие-либо флаги формата на stringstream?

К сожалению, стандартная библиотека не поддерживает передачу спецификаторов формата в виде строки, но вы можете сделать это с помощью библиотеки fmt :

std::string result = fmt::format("{:02}", value); // Python syntax

или

std::string result = fmt::sprintf("%02d", value); // printf syntax

Вам даже не нужно строить std::stringstream. Функция format возвращает строку напрямую.

Отказ от ответственности : я являюсь автором библиотеки fmt .

...