문제

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());
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top