用逗号格式化数字?
我想写一个方法,将采取一个整数,并返回一个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::locale
和std::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; }