C++ 98/03 hatte eine money_get
Facette solche Dinge zu tun. Leider war es ziemlich schmerzhaft (um es schön zu sagen).
C++ 11 hinzugefügt ein get_money
Manipulator, um das Leben ein bisschen einfacher zu machen. Es funktioniert etwas in der Art:
#include <iostream>
#include <iomanip>
int main() {
long double amt;
std::cin.imbue(std::locale(""));
std::cout.imbue(std::locale(""));
std::cin >> std::get_money(amt);
std::cout << std::showbase << std::put_money(amt) << "\n";
}
Nun, es gibt ein paar Dinge zu beachten. In erster Linie ist die Konvertierung von der externen in die interne Darstellung nicht spezifiziert, aber in den Implementierungen, die ich gesehen habe, wird nicht gelesen werden als 3458.5
- es würde gelesen und gespeichert werden als 345850
- das ist , eine Zählung der Anzahl von Pennies.
Wenn Sie put_money
verwenden, um die Daten zurück zu schreiben, wird sie jedoch symmetrisch mit den Eingaben konvertiert. Wenn Sie also $3458.5
eingegeben haben, wird es auf die gleiche Weise zurückgeschrieben.
Es gibt einen anderen Nachteil ist: Ich habe zumindest eine Implementierung gesehen, die seltsam pingelig über Eingabeformat war, so ist es erforderlich, entweder 0 oder 2 Stellen nach dem Komma bei der Eingabe, also entweder $3458.50
oder $3458
lesen würden in Ordnung, aber $3458.5
würde überhaupt nicht gelesen werden (es würde als eine fehlgeschlagene Konvertierung behandelt werden).
Das hört sich nach einer kleinen Ineffizienz an, um die man sich keine Sorgen machen sollte :) –
Ich versuche mich von C++ Locale Zeug fernzuhalten, da ich es wegen mangelnder Implementierungsunterstützung übermäßig komplex und aufdringlich finde. ist * ['std :: money_get'] (http://en.cppreference.com/w/cpp/locale/money_get) und zugehörige Maschinen. Soweit ich mich erinnere, schrieb P.J.Plauger eine Reihe von Artikeln darüber, wie man es benutzt. Vielleicht lohnt es sich zu googeln - oder nicht, IDK. Ein Beispiel für die Nicht-Portabilität ist die Verwendung einer UTF-8-Ländereinstellung im Beispielcode für die Dokumente, mit denen ich über cppreference.com verbunden bin. Das wird nicht mit Visual C++ funktionieren, wo dokumentiert wird, dass UTF-8-Ländereinstellungen nicht unterstützt werden. –
Nebenbei: Fließkomma-Variablen und Währung kommen nicht sehr gut miteinander aus. – edmz