c ++:用逗号格式化数字?

时间:2011-09-01 21:33:54

标签: c++ comma number-formatting

我想写一个方法,它将取一个整数并返回用逗号格式化的整数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。)

7 个答案:

答案 0 :(得分:49)

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();
}

免责声明:可移植性可能存在问题,您应该查看传递""时使用的区域设置

答案 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;
});