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


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

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

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

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

4 ответа:

вы можете использовать стандартные манипуляторы от <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;
}

можно использовать

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

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

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

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

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

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

или

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

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

отказ от ответственности: Я автор библиотека fmt.