code

C ++ : 쉼표로 숫자 형식을 지정 하시겠습니까?

codestyles 2020. 11. 17. 08:08
반응형

C ++ : 쉼표로 숫자 형식을 지정 하시겠습니까?


정수를 취하고 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 ++ 방법은 무엇입니까 ?

(보너스는 doubles도 처리 하는 것입니다.)


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

면책 조항 : 이식성이 문제가 될 수 있으며 ""전달 될 때 어떤 로케일이 사용되는지 살펴 봐야합니다.


당신은 야곱이 제안 할, 수 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;
}

다음 답변이 다른 답변보다 쉽다고 생각합니다.

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

이렇게하면 숫자 문자열에 쉼표를 빠르고 정확하게 삽입 할 수 있습니다.


위의 답변에 따라 다음 코드로 끝났습니다.

#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>.


이것은 꽤 오래된 학교이며 다른 문자열 버퍼를 인스턴스화하지 않도록 큰 루프에서 사용합니다.

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)?"":",");
    }
}

더 유연하게 만들기 위해 사용자 지정 수천 sep 및 그룹화 문자열로 패싯을 구성 할 수 있습니다. 이렇게하면 런타임에 설정할 수 있습니다.

#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;
}

참고 URL : https://stackoverflow.com/questions/7276826/c-format-number-with-commas

반응형