2017-02-19 12 views
2

숫자가있는 cvs 파일을 인쇄해야합니다. 파일을 인쇄 할 때 점이있는 숫자가 있지만 쉼표로 숫자가 필요합니다.C++ 점으로 표시되는 대신 쉼표로 두 자리 숫자로 파일을 인쇄하는 방법

여기 예입니다. 로케일 방법을 사용하여 터미널에서이 번호를 인쇄 할 경우 쉼표로 숫자를 얻지 만 파일에는 같은 번호이지만 점이 있습니다. 나는 왜 그런지 이해하지 못한다. 어떻게하면됩니까?

#include <iostream> 
#include <locale> 
#include <string>  // std::string, std::to_string 
#include <fstream> 
using namespace std; 
int main() 
{ 
    double x = 2.87; 
    std::setlocale(LC_NUMERIC, "de_DE"); 
    std::cout.imbue(std::locale("")); 
    std::cout << x << std::endl; 
    ofstream outputfile ("out.csv"); 
    if (outputfile.is_open()) 
     { 
      outputfile <<to_string(x)<<"\n\n"; 
     } 
    return 0; 
} 

미리 감사드립니다.

+2

imout the of object, of cout이 아닙니다. –

+0

@Neil [도움이되지 않는 것 같습니다] (http://coliru.stacked-crooked.com/a/2947e8488c8fb6a2). –

+0

'std :: setlocale'에''을 포함해야합니다. 헤더 없이도 작동하지만 보증은 없습니다 (예를 들어 Visual C++에서는 컴파일없이 컴파일되지 않습니다). –

답변

0

로케일은 시스템에 따라 다릅니다. 아마도 오타를 만들었을 것입니다. "de-DE"을 시도해보십시오. 적어도 작동 할 것입니다 (적어도 내 Windows에서는 해당). 프로그램이 본질적으로 독일 중심이 아닌 경우


그러나, 그럼 그냥 특정 소수점 문자를 얻기의 부작용에 대한 독일의 로케일을 남용하는 나쁜 프로그래밍 스타일이다, 나는 생각한다.

#include <string> 
#include <fstream> 
#include <locale> 

struct Comma final : std::numpunct<char> 
{ 
    char do_decimal_point() const override { return ','; } 
}; 

int main() 
{ 
    std::ofstream os("out.csv"); 
    os.imbue(std::locale(std::locale::classic(), new Comma)); 
    double d = 2.87; 
    os << d << '\n'; // prints 2,87 into the file 
} 

이 코드는 특별히 그냥 ','로 교체에만 소수점 문자로 포맷 표준 C++를 원한다 상태 :

여기 std::numpunct::do_decimal_point를 사용하여 대체 솔루션입니다. 특정 국가 또는 언어 또는 시스템 종속 속성에 대한 참조가 없습니다.

2

std::to_string()은 C 로켈 라이브러리를 사용합니다. "de_DE"은 컴퓨터에서 유효한 로케일 (또는 해당 문제에 대해서는 Coliru)이 아니므로 기본 C 로켈이 사용되고 사용되고 .을 사용하는 것 같습니다. 해결 방법은 "de_DE.UTF-8"입니다. 제쳐두고 std::locale""을 사용하면 항상 쉼표가 생성되지는 않습니다. 대신 컴퓨터에 설정된 로케일에 따라 다릅니다.

+0

[흥미 롭다!] (http://coliru.stacked-crooked.com/a/1fe5711da15e03f1) –

+0

보다 정확하게 말하면'std :: to_string'은'sprintf' 'sprintf'는 C 로케일 라이브러리를 사용합니다. –