web-dev-qa-db-fra.com

Équivalent de% 02d avec std :: stringstream?

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;
57
Andreas Brinck

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;
}
72
CB Bailey

Vous pouvez utiliser

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

Vous ne pouvez pas faire beaucoup mieux en C++ standard. Alternativement, vous pouvez utiliser Boost.Format:

stream << boost::format("%|02|")%value;
9
Marcelo Cantos

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 .

2
vitaut