std::string et la chaîne de format
J'ai trouvé le code ci-dessous par le biais de Google. Il ne fait presque ce que je veux faire, mais il ne fournit pas un moyen pour indiquer la précision like '%.*f' t en C de type chaînes de format. Aussi, il ne fournit pas de rien au-delà de 5 décimales. Vais-je avoir à coller avec chaînes C et snprintf?
#include <string>
#include <sstream>
#include <iostream>
template <class T>
std::string to_string(T t, std::ios_base & (*f)(std::ios_base&))
{
std::ostringstream oss;
oss << f << t;
return oss.str();
}
int main()
{
std::cout<<to_string<double>(3.1415926535897931, std::dec)<<std::endl;
return 0;
}
Vous devez vous connecter pour publier un commentaire.
Vous souhaitez utiliser le
std::setprecision
manipulateur:std::cout
mais pi est mis en forme à l'intérieur de to_string<long>(long t). En outre, puisque vous avez passé pi comme unlong
, il devient3L
.C++ ne serait pas couronnée de succès si elle ne pouvait pas faire quelque chose C peut.
Vous devez vérifier les manipulateurs.
Si vous voulez C-mise en forme de style (que je préfère, c'est plus laconique), découvrez Coup de pouce.Format.
Avez-vous regardé Boost::format?
Edit: C'est pas tout à fait clair ce que vous voulez. Si vous voulez juste écrire une chaîne de caractères, mise en forme, vous pouvez utiliser des manipulateurs sur un stringstream. Si vous souhaitez utiliser printf style de formatage de chaînes de caractères, mais de conserver le type de sécurité, Boost::format peut/va le faire.
Prenant la quasi-réponse correcte (à noter que std::dec est redondante dans ce cas simple):
Toutefois, si vous voulez la fonction to_string à se comporter comme vous le souhaitez, ce qui est un peu plus difficile. Vous auriez besoin de passer
setprecision(9)
à lato_string<T>
fonction, et il n'accepte pas les arguments de ce type. Vous voulez basé sur un modèle de version:Cela fonctionne parce que vous n'avez vraiment pas besoin de std::dec en to_string. Mais si vous avez besoin de passer plus manipulateurs, la solution la plus simple est d'ajouter
template <class T, class F1, class F2> std::string to_string(T t, F1 f1, F2 f2)
etcetera. Techniquement, ce n'est pas très bien, mais il va tellement rare que vous n'avez probablement pas besoin.