2017-02-19 97 views
2

Мне нужно распечатать файл cvs с номерами. Когда файл печатается, у меня есть номера с точками, но они мне нужны запятыми.C++ Как напечатать в файле двойное десятичное число с запятой (вместо точки)

Вот пример. Если я напечатаю это число в терминале с помощью метода locale, я получаю номер с запятой, но в файле у меня одинаковое число, но с точкой. Я не понимаю, почему. Как я мог это сделать?

#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

imbue thestream object, а не cout. –

+0

@Neil [Кажется, не помогает] (http://coliru.stacked-crooked.com/a/2947e8488c8fb6a2). –

+0

Обратите внимание, что вам нужно включить '' для 'std :: setlocale'. Он может работать без заголовка, но нет никакой гарантии (например, он не компилируется без него в Visual C++). –

ответ

0

Местные жители являются системными. Вы, вероятно, просто сделали опечатку; попробуйте "de-DE", который, вероятно, будет работать (по крайней мере, на моей Windows).


Однако, если ваша программа не по своей сути германо-ориентированной, то злоупотребление немецкой языковой только для побочного эффекта получения конкретного символа десятичной точки плохой стиль программирования, я думаю.

Вот альтернативное решение с использованием std::numpunct::do_decimal_point:

#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++ форматирование только точечиости десятичных заменена ','. В нем нет ссылок на конкретные страны или языки или на системно-зависимые свойства.

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