반응형
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 ++ 방법은 무엇입니까 ?
(보너스는 double
s도 처리 하는 것입니다.)
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
반응형
'code' 카테고리의 다른 글
Linux에서 C # 개발을위한 IDE? (0) | 2020.11.18 |
---|---|
colgroup에서 텍스트 정렬 센터 사용 (0) | 2020.11.17 |
iPad 및 iPad 만 대상으로하는 CSS 미디어 쿼리? (0) | 2020.11.17 |
자바 스크립트에서 iso 날짜를 밀리 초로 변환 (0) | 2020.11.17 |
Cygwin 오류 : "-bash : 포크 : 재시도 : 리소스를 일시적으로 사용할 수 없음" (0) | 2020.11.17 |