Je veux sortir un entier dans un std::stringstream
avec le format équivalent de printf
's %02d
. Existe-t-il un moyen plus simple d'y parvenir que:
std::stringstream stream;
stream.setfill('0');
stream.setw(2);
stream << value;
Est-il possible de diffuser une sorte de drapeaux de format dans le stringstream
, quelque chose comme (pseudocode):
stream << flags("%02d") << value;
Vous pouvez utiliser les manipulateurs standard de <iomanip>
mais il n'y en a pas de propre qui fait à la fois fill
et width
à la fois:
stream << std::setfill('0') << std::setw(2) << value;
Il ne serait pas difficile d'écrire votre propre objet qui, une fois inséré dans le flux, exécutait les deux fonctions:
stream << myfillandw( '0', 2 ) << value;
Par exemple.
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;
}
Vous pouvez utiliser
stream<<setfill('0')<<setw(2)<<value;
Vous ne pouvez pas faire beaucoup mieux en C++ standard. Alternativement, vous pouvez utiliser Boost.Format:
stream << boost::format("%|02|")%value;
Est-il possible de diffuser une sorte de drapeaux de format dans le
stringstream
?
Malheureusement, la bibliothèque standard ne prend pas en charge le passage de spécificateurs de format sous forme de chaîne, mais vous pouvez le faire avec la bibliothèque fmt :
std::string result = fmt::format("{:02}", value); // Python syntax
ou
std::string result = fmt::sprintf("%02d", value); // printf syntax
Vous n'avez même pas besoin de construire std::stringstream
. La fonction format
renverra directement une chaîne.
Avertissement : Je suis l'auteur de la bibliothèque fmt .