Frage

In C ++ Ich habe eine Float / Double Variable bekam.

Wenn ich diesen Druck mit zum Beispiel cout die resultierende Zeichenfolge Perioden begrenzt.

cout << 3.1415 << endl
$> 3.1415

Gibt es einen einfachen Weg, um die Doppel zu zwingen, mit einem Komma gedruckt werden?

cout << 3.1415 << endl
$> 3,1415
War es hilfreich?

Lösung

imbue() cout mit einem locale deren numpunct Facette der decimal_point() Member-Funktion gibt ein Komma.

Herstellung einer solchen locale kann auf verschiedene Arten erfolgen. Sie könnten eine benannte locale auf Ihrem System (std::locale("fr"), vielleicht) verwenden. Alternativ können Sie Ihre eigene numpuct ableiten, implementieren das do_decimal_point() Mitglied in es.

Beispiel des zweiten Ansatzes:

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

Wird als:

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

Andere Tipps

Sie müssen den Strom mit einem anderen Gebietsschema impue, einer, dessen num_punct (IIRC) Facette gibt ein Komma.

Wenn Ihre Plattform locale Formate mit Komma, dann

cout.imbue(locale(""));

sollte ausreichend sein.

Dies wird durch Ihr Programm locale gesteuert.

Wie Sie ein Programm das Standardgebietsschema auf der Plattform abhängt. Auf POSIX-Plattformen, ist es mit dem LANG und LC_ * Umgebungsvariablen, zum Beispiel.

Sie können eine bestimmte locale erzwingen - unterscheidet sich von der Standard - in einem C ++ Programm von ios :: imbue aufrufen. So etwas wie dies funktionieren könnte:

#include <locale>
cout.imbue(std::locale("German_germany"));

Die Idee ist, ein Gebietsschema zu zwingen, wo Komma das Dezimaltrennzeichen ist. Möglicherweise müssen Sie die „German_germany“ string anpassen, das Verhalten Sie auf die jeweilige Plattform erhalten möchten.

Um genau zu sein, wird dies durch den std::numpunct<charT>::decimal_point() Wert gesteuert. Sie können eine andere Locale mit einem anderen imbue() decimal_point()

Alt Faden, aber trotzdem ... sollte man sich bewusst sein, dass eine std::locale mit dem String „schön“ macht, komplett mit korrekten Dezimalpunkt, Tausendertrennzeichen und was nicht, je nach Plattform und locale. Wahrscheinlich imbue() verwendet, wird jedes Parsing der Zeichenfolge brechen, nachdem sie formatiert wird. Zum Beispiel:

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

Gibt die folgende Ausgabe:
without locale: 1234.56
with fr locale: 1 234,56

Mit strtod() oder ähnliches auf der zweiten Saite wird wahrscheinlich nicht sehr gut funktioniert ... Auch der Raum zwischen „1“ und „2“ in der zweiten Ausgabe-String ist ein ein nicht-Bruch, der String machen noch schöner : -)

Sehr alter Thread, aber trotzdem ... hatte ich das Problem, einen Texteintrag unter Gtkmm-3.0 mit dem Ergebnis einer Abstandsberechnung zu füllen. Um die Dinge klarer füge ich ein Beispiel, wo ich einige Weisheiten von mehreren Stellen konzentriert habe ich die letzten Tage gelesen:

#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());
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top