2017-02-19 4 views
2

J'ai besoin d'imprimer un fichier cvs avec des nombres. Lorsque le fichier est imprimé, j'ai des nombres avec des points, mais j'en ai besoin avec des virgules.C++ Comment imprimer dans un fichier un nombre double décimal avec virgule (au lieu de point)

Voici un exemple. Si j'imprime ce numéro dans le terminal en utilisant la méthode locale, j'obtiens un nombre avec virgule, mais dans le fichier j'ai le même numéro mais avec le point. Je ne comprends pas pourquoi. Comment pourrais-je faire?

#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; 
} 

Merci d'avance.

+2

imbrique l'objet ofstream, pas cout. –

+0

@Neil [Ne semble pas aider] (http://coliru.stacked-crooked.com/a/2947e8488c8fb6a2). –

+0

Notez que vous devez inclure '' pour 'std :: setlocale'. Cela peut fonctionner sans l'en-tête, mais il n'y a aucune garantie (par exemple, il ne compile pas sans cela dans Visual C++). –

Répondre

0

Les paramètres régionaux sont spécifiques au système. Vous avez probablement fait une faute de frappe; essayez "de-DE", qui fonctionnera probablement (au moins, il fonctionne sur mon Windows).


Cependant, si votre programme n'est pas intrinsèquement allemand centrée, puis abuser de l'environnement local allemand juste pour l'effet secondaire d'obtenir un caractère de point décimal spécifique est mauvais style de programmation, je pense.

Voici une solution alternative utilisant 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 
} 

Ce code stipule expressément qu'il veut juste la norme C++ mise en forme avec seulement le caractère point décimal remplacé par ','. Il ne fait aucune référence à des pays ou des langues spécifiques ou à des propriétés dépendant du système.

2

Votre problème est que std::to_string() utilise les bibliothèques locales C. Il semble que "de_DE" ne soit pas un paramètre régional valide sur votre machine (ou Coliru d'ailleurs), ce qui entraîne l'utilisation des paramètres régionaux C par défaut et l'utilisation de .. La solution consiste à utiliser "de_DE.UTF-8". En outre, l'utilisation de "" pour std::locale ne produira pas toujours de virgules; à la place, cela dépendra des paramètres régionaux définis pour votre machine.

+0

[Intéressant!] (Http://coliru.stacked-crooked.com/a/1fe5711da15e03f1) –

+0

Plus précisément, 'std :: to_string' est défini pour fonctionner en termes de' sprintf' , et 'sprintf' utilise les bibliothèques locales C. –