12
votes

Comment imprimer un double avec une virgule

en C ++ j'ai un flotteur / double variable.

Lorsque j'imprime cela avec, par exemple, la chaîne résultante est délimitée de période. p>

cout << 3.1415 << endl
$> 3,1415


0 commentaires

6 Réponses :


2
votes

Ceci est contrôlé par la locale de votre programme.

Comment définir la localisation par défaut d'un programme dépend de la plate-forme. Sur les plates-formes de type POSIX, c'est avec les variables d'environnement LANG et LC_ *, par exemple.

Vous pouvez forcer une locale particulière - différente de la valeur par défaut - dans un programme C ++ en appelant iOS :: Impubue. Quelque chose comme ça pourrait fonctionner: xxx

L'idée est de forcer une locale où la virgule est le séparateur décimal. Vous devrez peut-être ajuster la chaîne "allemand_germanany" pour obtenir le comportement souhaité sur votre plate-forme particulière.


1 commentaires

Utilisation de votre exemple Résultats dans: STD :: Erreur d'exécution Locale :: Facet :: _ s_create_c_locale Nom non valide



3
votes

Vous devez nuire au flux avec une locale différente, dont la facette dont NUM_PUNCT (IIRC) spécifie une virgule.

Si votre paramètre locale de plate-forme avec des virgules, alors xxx < p> devrait être suffisant.


1 commentaires

Thx, votre réponse a fonctionné. Mais j'aimerais accepter une réponse qui sera plus générique (si vous n'êtes pas aussi chanceux avec le prérévisage local correct sur votre plate-forme). Toujours +1 parce que c'est la méthode la plus facile.



1
votes

Pour être précis, celui-ci est contrôlé par le std :: numpunct :: décimal_point () valeur. Vous pouvez IMBUE () Un autre paramètre local avec un autre décimal_point ()


0 commentaires

13
votes

IMBUE () COUT CODE> avec un Locale code> Quel numpunct code> de la facette code> décimal_point () code> La fonction membre renvoie une virgule.

Obtention d'un tel locale code> peut être effectué de plusieurs manières. Vous pouvez utiliser un local nommé disponible sur votre système ( std :: locale ("fr") code>, peut-être). Sinon, vous pouvez dériver votre propre numéro de votre propre numéro, implémenter le membre do_decimal_point () code> membre. P>

Exemple de la deuxième approche: P>

std::cout.imbue(std::locale(std::cout.getloc(), new DecimalSeparator<char>(',')));


7 commentaires

Utilisation de votre exemple Résultats dans: STD :: Erreur d'exécution Locale :: Facet :: _ s_create_c_locale Nom non valide


Cette erreur signifie probablement que, sur votre plate-forme, le nom "FR" ne lie pas à un lieu local.


J'ai deviné autant, mais comment pourriez-vous découvrir quels noms sont liés à un local.


Malheureusement, je ne pense pas qu'il y ait une manière portable.


Le savez-vous pour * Nix peut-être?


Sur Linux: la commande locale -a, mais je ne sais pas comment faire cela par programme.


La récupération de manière programmatique sur la locale n'était pas une exigence, cela fonctionne bien. Et je suppose que tout le monde a besoin de le faire de manière programmatique pourrait faire quelque chose de recherche-fu sur un appel système (). THX! Considérez votre réponse acceptée.



0
votes

Un vieux fil, mais de toute façon ... il faut savoir que l'utilisation d'un std :: locale code> fait la chaîne "jolie", complète avec un point décimal correct, des milliers de séparateurs et de quoi ne pas, selon la plate-forme et la locale. La plupart probablement, en utilisant IMBUE () code> enfreindra toute analyse de la chaîne après son formatage. Par exemple:

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();


0 commentaires

0
votes

Très vieux fil, mais de toute façon ... J'avais le problème de remplir une entrée de texte sous GTKMM-3.0 avec le résultat d'un calcul de distance. Pour rendre les choses plus claires, j'ajoute un exemple, où j'ai concentré certaines sagesse de plusieurs postes, j'ai lu les derniers jours:

#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());


0 commentaires