2010-05-15 5 views
50

Je souhaite générer un nombre entier à std::stringstream au format équivalent printf%02d. Y at-il un moyen plus facile d'y parvenir que:Equivalent de% 02d avec std :: stringstream?

std::stringstream stream; 
stream.setfill('0'); 
stream.setw(2); 
stream << value; 

Est-il possible de diffuser une sorte de drapeaux de format à l'stringstream, quelque chose comme (pseudo-code):

stream << flags("%02d") << value; 
+5

Cela ne devrait-il pas être 'stream.fill ('0')' et 'stream.width (2)'? Vous utilisez le nom des manipulateurs presque comme si vous connaissiez la réponse à votre propre question? –

Répondre

63

Vous pouvez utiliser les manipulateurs standard de <iomanip> mais il n'y en a pas un seul 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 que lorsqu'il est inséré dans le flux effectué 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; 
} 
9

Vous pouvez utiliser

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

Vous ne pouvez pas faire beaucoup mieux en C++ standard. Vous pouvez également utiliser Boost.Format:

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

Et si vous n'utilisez pas 'stream' pour rien d'autre, vous n'en avez pas besoin, car boost :: format' produit déjà une chaîne. – UncleBens

+1

J'ai entendu que vous devez passer à 'str (...)' puis –

+0

Jahonnes vous pouvez utiliser std :: string myStr = (boost :: format ("% | 02 |") valeur%) .str(); –

0

Est-il possible de diffuser une sorte de drapeaux de format à l'stringstream?

Malheureusement, la bibliothèque standard ne supporte pas le format passant spécificateurs comme une chaîne, mais vous pouvez le faire avec le fmt library:

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

ou

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

Vous ne même pas besoin de construire std::stringstream. La fonction format renvoie une chaîne directement.

Clause de non-responsabilité: Je suis l'auteur du .

Questions connexes