2010-06-04 4 views
5

Je suis en train d'utiliser spécificateurs largeur et de précision avec boost::format, comme ceci:Utilisation * Largeur et précision Prescripteurs avec boost :: format

#include <boost\format.hpp> 
#include <string> 

int main() 
{ 
    int n = 5; 
    std::string s = (boost::format("%*.*s") % (n*2) % (n*2) % "Hello").str(); 
    return 0; 
} 

Mais cela ne fonctionne pas parce que boost::format ne supporte pas la * spécificateur. Boost lève une exception lors de l'analyse de la chaîne.

Existe-t-il un moyen d'atteindre le même objectif, de préférence en utilisant un remplacement direct?

Répondre

8

Essayez ceci:

#include <boost/format.hpp> 
#include <iomanip> 

using namespace std; 
using namespace boost; 

int main() 
{ 
    int n = 5; 
    string s = (format("%s") % io::group(setw(n*2), setprecision(n*2), "Hello")).str(); 
    return 0; 
} 
groupe

() vous permet d'encapsuler un ou plusieurs manipulateurs io avec un paramètre.

+0

C'est ce que je suis allé avec, mais j'essaye de le faire d'une autre manière, aussi. Voir ici: http://stackoverflow.com/questions/2981724/boostfunction-boostlambda-again –

+1

BTW merci de m'avoir indiqué 'group' –

+0

Lorsqu'il est appliqué aux chaînes,' setprecision' est ignoré dans 'format', comme il est pendant les E/S de flux ordinaires. –

2

Eh bien, ce n'est pas une halte-accueil, mais une façon de le faire serait de construire la chaîne de format dynamique:

#include <boost/format.hpp> 
#include <boost/lexical_cast.hpp> 

int main() 
{ 
    int n = 5; 
    const std::string f("%" + 
         boost::lexical_cast<std::string>(n * 2) + "." + 
         boost::lexical_cast<std::string>(n * 2) + "s"); 
    std::string s = (boost::format(f) % "Hello").str(); 
} 

Bien sûr, si vous avez fait cela souvent, vous pouvez factoriser la construction de la chaîne de format dans une fonction.

Vous pouvez également utiliser boost::format() pour générer la chaîne de format; elle est plus courte, mais potentiellement moins lisible, en particulier pour les chaînes de format longues:

const std::string f = (boost::format("%%%d.%ds") % (n*2) % (n*2)).str(); 
std::string s = (boost::format(f) % "Hello").str(); 

(crédit Ferruccio pour l'affichage de la seconde idée dans les commentaires)

+0

Oui, c'est la meilleure alternative que j'ai trouvée jusqu'à présent. Comme vous l'avez peut-être imaginé, je refais le code ancien. Certaines de ces chaînes sont super complexes, et le faire de cette façon fonctionnerait, mais serait très difficile. +1 de toute façon –

+3

Pourquoi ne pas utiliser boost :: format pour générer la chaîne de format? c'est-à-dire std :: chaîne f = (boost :: format ("%%% d.% ds")% n * 2% n * 2) .str(); – Ferruccio

Questions connexes