用逗号格式化数字?

我想写一个方法,将采取一个整数,并返回一个std::string的整数格式与逗号。

示例声明:

 std::string FormatWithCommas(long value); 

用法示例:

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

什么是使用逗号将数字格式化为string的C ++方法?

(奖金也是要处理double的。)

使用std::localestd::stringstream

 #include <iomanip> #include <locale> template<class T> std::string FormatWithCommas(T value) { std::stringstream ss; ss.imbue(std::locale("")); ss << std::fixed << value; return ss.str(); } 

免责声明:可移植性可能是一个问题,你应该看看在传递""时使用的语言环境

你可以像雅各布所说的那样做,并且使用"" locale”,但是这会使用系统默认值,这并不能保证你得到逗号。 如果您要强制使用逗号(不pipe系统默认的区域设置如何),您可以通过提供您自己的numpunct方面来实现。 例如:

 #include <locale> #include <iostream> #include <iomanip> class comma_numpunct : public std::numpunct<char> { protected: virtual char do_thousands_sep() const { return ','; } virtual std::string 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; } 

我认为以下答案比其他答案更容易:

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

这将快速并正确地将逗号插入到您的数字string中。

基于上面的答案,我结束了这个代码:

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

如果你正在使用Qt,你可以使用这个代码:

 const QLocale & cLocale = QLocale::c(); QString resultString = cLocale.toString(number); 

另外,不要忘记添加#include <QLocale>

这是相当古老的学校,我使用它在大循环,以避免实例化另一个string缓冲区。

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

为了使它更加灵活,你可以构build一个自定义的数千个sep和分组string的方面。 这样你可以在运行时设置它。

 #include <locale> #include <iostream> #include <iomanip> #include <string> class comma_numpunct : public std::numpunct<char> { 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::string do_grouping() const {return m_grouping;} private: char m_thousands_sep; std::string 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; }