Equivalente% 02d con std :: stringstream?
-
27-09-2019 - |
Pregunta
Quiero salida de un entero a una std::stringstream
con el formato equivalente de printf
de %02d
. ¿Existe una manera más fácil de lograrlo que:
std::stringstream stream;
stream.setfill('0');
stream.setw(2);
stream << value;
¿Es posible transmitir algún tipo de banderas de formato a la stringstream
, algo así como (pseudocódigo):
stream << flags("%02d") << value;
Solución
Puede utilizar los manipuladores estándar de <iomanip>
pero no hay una ordenada que hace las dos fill
y width
a la vez:
stream << std::setfill('0') << std::setw(2) << value;
No sería difícil escribir su propio objeto que cuando se inserta en la corriente cabo ambas funciones:
stream << myfillandw( '0', 2 ) << value;
por ejemplo.
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;
}
Otros consejos
Puede utilizar
stream<<setfill('0')<<setw(2)<<value;
No se puede hacer mucho mejor que en C ++ estándar. Como alternativa, puede utilizar Boost.Format:
stream << boost::format("%|02|")%value;
¿Es posible transmitir algún tipo de banderas de formato a la
stringstream
?
Por desgracia, la biblioteca estándar no admite pasar especificadores de formato como una cadena, pero se puede hacer esto con el FMT biblioteca:
std::string result = fmt::format("{:02}", value); // Python syntax
o
std::string result = fmt::sprintf("%02d", value); // printf syntax
Usted no necesita ni siquiera std::stringstream
constructo. La función format
devolverá una cadena directa.
Aviso Legal : Soy el autor de la FMT biblioteca .