我想写一个方法,它将取一个整数并返回用逗号格式化的整数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
。)
答案 0 :(得分:49)
将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();
}
免责声明:可移植性可能存在问题,您应该查看传递""
时使用的区域设置
答案 1 :(得分:46)
您可以像Jacob建议的那样,imbue
使用""
语言环境 - 但这将使用系统默认值,但不保证您获得逗号。如果要强制使用逗号(无论系统默认的语言环境设置如何),都可以通过提供自己的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;
}
答案 2 :(得分:29)
我认为以下答案比其他答案更容易:
string numWithCommas = to_string(value);
int insertPosition = numWithCommas.length() - 3;
while (insertPosition > 0) {
numWithCommas.insert(insertPosition, ",");
insertPosition-=3;
}
这将快速正确地将逗号插入您的数字字符串。
答案 3 :(得分:2)
基于上面的答案,我最终得到了这段代码:
#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();
}
答案 4 :(得分:2)
如果您使用的是Qt,则可以使用以下代码:
const QLocale & cLocale = QLocale::c();
QString resultString = cLocale.toString(number);
另外,不要忘记添加#include <QLocale>
。
答案 5 :(得分:2)
这是相当古老的学校,我在大循环中使用它以避免实例化另一个字符串缓冲区。
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)?"":",");
}
}
答案 6 :(得分:0)
为了使其更灵活,您可以使用自定义的千位sep和分组字符串构建构面。 这样您就可以在运行时设置它。
$('#newAuthority').on("click", function() {
var $newAuthorityCon = $(".new-authority-container");
var $row = $('<div />', {
class: 'row'
}).appendTo($newAuthorityCon);
var $large11 = $('<div />', {
class: 'large-11 columns'
}).appendTo($row);
var $input = $('<input>', {
type: 'text',
placeholder: 'email@domain.com',
class: 'authority-email'
}).appendTo($large11);
var $large1 = $('<div />', {
class: 'large-1 columns'
}).appendTo($row);
var $remove = $('<a>', {
href: '#',
class: 'remove'
}).html('<i class="fa fa-fa fa-remove"></i>').appendTo($large1);
return false;
});