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;
¿Fue útil?

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top