문제
C ++에서는 플로트/이중 변수가 있습니다.
예를 들어 Cout과 함께 이것을 인쇄 할 때 결과 문자열은주기에 해당됩니다.
cout << 3.1415 << endl
$> 3.1415
더블을 쉼표로 인쇄하도록 강제로 쉽게 인쇄 할 수있는 방법이 있습니까?
cout << 3.1415 << endl
$> 3,1415
해결책
imbue() cout
a locale
누구 numpunct
패싯 decimal_point()
멤버 함수는 쉼표를 반환합니다.
그러한 획득 locale
여러 가지 방법으로 수행 할 수 있습니다. 시스템에서 사용 가능한 이름의 로케일을 사용할 수 있습니다 (std::locale("fr")
, 아마도). 또는 자신의 낙지를 도출하고 구현할 수 있습니다. do_decimal_point()
그 안에 회원.
두 번째 접근법의 예 :
template<typename CharT>
class DecimalSeparator : public std::numpunct<CharT>
{
public:
DecimalSeparator(CharT Separator)
: m_Separator(Separator)
{}
protected:
CharT do_decimal_point()const
{
return m_Separator;
}
private:
CharT m_Separator;
};
사용 :
std::cout.imbue(std::locale(std::cout.getloc(), new DecimalSeparator<char>(',')));
다른 팁
NUM_PUNCT (IIRC) 패싯이 쉼표를 지정하는 다른 로케일로 스트림을 장애가 필요합니다.
플랫폼 로케일 형식이 쉼표로 형식화되면
cout.imbue(locale(""));
충분해야합니다.
이것은 프로그램의 로케일에 의해 제어됩니다.
프로그램의 기본 로케일을 설정하는 방법은 플랫폼에 따라 다릅니다. POSIX 유형 플랫폼에서는 예를 들어 LANG 및 LC_* 환경 변수가 있습니다.
iOS :: imbue를 호출하여 C ++ 프로그램 내에서 특정 로케일을 기본값과 강제로 강제로 강제로 할 수 있습니다. 이와 같은 것이 효과가있을 수 있습니다.
#include <locale>
cout.imbue(std::locale("German_germany"));
아이디어는 쉼표가 소수점 분리기 인 로케일을 강요하는 것입니다. 특정 플랫폼에서 원하는 동작을 얻으려면 "German_germany"문자열을 조정해야 할 수도 있습니다.
정확히 말하면, 이것은에 의해 제어됩니다 std::numpunct<charT>::decimal_point()
값. 당신은 할 수 있습니다 imbue()
다른 로케일이있는 다른 로케일 decimal_point()
오래된 실이지만 어쨌든 ... std::locale
플랫폼과 로케일에 따라 올바른 소수점, 수천 개의 분리기 및 그렇지 않은 것으로 문자열을 "예쁜"으로 만듭니다. 아마도 사용 imbue()
문자열이 형식화 된 후 문자열의 구문 분석을 중단합니다. 예를 들어:
std::ostringstream s;
std::locale l("fr-fr");
s << "without locale: " << 1234.56L << std::endl;
s.imbue(l);
s << "with fr locale: " << 1234.56L << std::endl;
std::cout << s.str();
다음 출력을 제공합니다.
without locale: 1234.56
with fr locale: 1 234,56
사용 strtod()
또는 두 번째 문자열의 비슷한 것은 아마도 잘 작동하지 않을 것입니다 ... 또한, 두 번째 출력 문자열의 "1"과 "2"사이의 공간은 깨지지 않는 공간이므로 문자열을 더 예쁘게 만듭니다 :-)
아주 오래된 스레드이지만 어쨌든 ... 거리 계산 결과와 함께 gtkmm-3.0에 따라 텍스트 항목을 채우는 데 문제가있었습니다. 일을 더 명확하게하기 위해 나는 마지막 날을 읽은 여러 게시물의 지혜를 집중시킨 예를 추가합니다.
#include <locale>
// next not necessary, added only for clarity
#include <gtkmm-3.0/gtkmm.h>
Gtk::Entry m_Text;
// a distance measured in kilometers
double totalDistance = 35.45678;
std::stringstream str;
// I am using locale of Germany, pay attention to the _
str.imbue(std::locale("de_DE"));
// now we have decimal comma instead of point
str << std::fixed << std::setprecision(4) << std::setw(16) << totalDistance << " km";
// the wished formatting corresponds to "%16.4f km" in printf
m_Text.set_text(str.str());