c ++: nombre de format avec des virgules?

Je veux écrire une méthode qui prendra un entier et renverra un std::ssortingng de cet entier formaté avec des virgules.

Exemple de déclaration:

 std::ssortingng FormatWithCommas(long value); 

Exemple d’utilisation:

 std::ssortingng result = FormatWithCommas(7800); std::ssortingng result2 = FormatWithCommas(5100100); std::ssortingng result3 = FormatWithCommas(201234567890); // result = "7,800" // result2 = "5,100,100" // result3 = "201,234,567,890" 

Quelle est la manière C ++ de formater un nombre sous forme de ssortingng avec des virgules?

(Le bonus serait de gérer aussi les double .)

Utilisez std::locale avec std::ssortingngstream

 #include  #include  template std::ssortingng FormatWithCommas(T value) { std::ssortingngstream ss; ss.imbue(std::locale("")); ss << std::fixed << value; return ss.str(); } 

Disclaimer: La portabilité peut être un problème et vous devriez probablement regarder quelle locale est utilisée lorsque "" est passé

Vous pouvez faire comme Jacob a suggéré, et imbue de la "" locale – mais cela utilisera le système par défaut, ce qui ne garantit pas que vous obtenez la virgule. Si vous souhaitez forcer la virgule (indépendamment des parameters régionaux par défaut du système), vous pouvez le faire en fournissant votre propre facette numpunct . Par exemple:

 #include  #include  #include  class comma_numpunct : public std::numpunct { protected: virtual char do_thousands_sep() const { return ','; } virtual std::ssortingng do_grouping() const { return "\03"; } }; int main() { // this creates a new locale based on the current application default // (which is either the one given on startup, but can be overriden with // std::locale::global) - then extends it with an extra facet that // controls numeric output. std::locale comma_locale(std::locale(), new comma_numpunct()); // tell cout to use our new locale. std::cout.imbue(comma_locale); std::cout << std::setprecision(2) << std::fixed << 1000000.1234; } 

Je considère que la réponse suivante est plus facile que les autres:

 ssortingng numWithCommas = to_ssortingng(value); int insertPosition = numWithCommas.length() - 3; while (insertPosition > 0) { numWithCommas.insert(insertPosition, ","); insertPosition-=3; } 

Cela va rapidement et correctement insérer des virgules dans votre chaîne de chiffres.

C’est assez vieux, je l’utilise dans de grandes boucles pour éviter d’instancier un autre tampon de chaîne.

 void tocout(long a) { long c = 1; if(a<0) {a*=-1;cout<<"-";} while((c*=1000)1) { int t = (a%c)/(c/1000); cout << (((c>a)||(t>99))?"":((t>9)?"0":"00")) << t; cout << (((c/=1000)==1)?"":","); } } 

sur la base des réponses ci-dessus, je me suis retrouvé avec ce code:

 #include  #include  template std::ssortingng numberFormatWithCommas(T value){ struct Numpunct: public std::numpunct{ protected: virtual char do_thousands_sep() const{return ',';} virtual std::ssortingng do_grouping() const{return "\03";} }; std::ssortingngstream ss; ss.imbue({std::locale(), new Numpunct}); ss << std::setprecision(2) << std::fixed << value; return ss.str(); } 

Si vous utilisez Qt, vous pouvez utiliser ce code:

 const QLocale & cLocale = QLocale::c(); QSsortingng resultSsortingng = cLocale.toSsortingng(number); 

N’oubliez pas non plus d’append #include .

Pour le rendre plus flexible, vous pouvez construire la facette avec une chaîne de milliers et de regroupement personnalisée. De cette façon, vous pouvez le définir à l’exécution.

 #include  #include  #include  #include  class comma_numpunct : public std::numpunct { public: comma_numpunct(char thousands_sep, const char* grouping) :m_thousands_sep(thousands_sep), m_grouping(grouping){} protected: char do_thousands_sep() const{return m_thousands_sep;} std::ssortingng do_grouping() const {return m_grouping;} private: char m_thousands_sep; std::ssortingng m_grouping; }; int main() { std::locale comma_locale(std::locale(), new comma_numpunct(',', "\03")); std::cout.imbue(comma_locale); std::cout << std::setprecision(2) << std::fixed << 1000000.1234; }