Эквивалент% 02d с std:: stringstream?
Я хочу вывести целое число в std::stringstream
с эквивалентным форматом printf
%02d
. Есть ли более простой способ добиться этого, чем:
std::stringstream stream;
stream.setfill('0');
stream.setw(2);
stream << value;
Возможно ли передать потоки формата в stringstream
, что-то вроде (псевдокод):
stream << flags("%02d") << value;
Ответы
Ответ 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.