2010-05-15 9 views
50

Quiero dar salida a un número entero a std::stringstream con el formato equivalente de printf 's %02d. ¿Existe una manera más fácil de lograrlo que:Equivalente de% 02d con std :: stringstream?

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; 
+5

¿No debería ser 'stream.fill ('0')' y 'stream.width (2)'? ¿Estás usando el nombre de los manipuladores casi como si supieras la respuesta a tu propia pregunta? –

Respuesta

63

Puede utilizar los manipuladores estándar de <iomanip> pero no hay ninguno que haga tanto fill como 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; 
} 
9

Puede utilizar

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

No se puede hacer mucho mejor en el estándar C++. Como alternativa, puede utilizar Boost.Format:

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

Y si no está utilizando 'stream' para nada más, no lo necesita, porque' boost :: format' ya produce una cadena. – UncleBens

+1

Escuché que tiene que pasarlo a 'str (...)' luego –

+0

Jahonnes puede usar std :: string myStr = (boost :: format ("% | 02 |")% value) .str(); –

0

¿Es posible transmitir algún tipo de banderas de formato a la stringstream?

Por desgracia, la biblioteca estándar no soportan el paso de los especificadores de formato como una cadena, pero se puede hacer esto con la fmt library:

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

o

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

ni siquiera necesita construir std::stringstream. La función format devolverá una cadena directamente.

Descargo de responsabilidad: Soy el autor del fmt library.

Cuestiones relacionadas