Подтвердить что ты не робот

Эквивалент% 02d с std:: stringstream?

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

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

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

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

Ответ 1

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

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

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

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

например.

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

Ответ 2

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

stream << boost::format("%|02|")%value;

Ответ 3

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

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

Ответ 4

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

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

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

или

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

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

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