2016-04-09 19 views
1

Ich muss einen Wert (cin) einschließlich eines Dollarzeichens und eines Dollarbetrags einlesen, aber ich möchte nur den Betrag einlesen.Gelesen in Dollar Betrag (mit Dollarzeichen) C++

Mit anderen Worten, ich habe diesen Eingang: „$ 3458,5“ aber ich möchte lesen und speichern „3458,5“

Der aktuelle Ansatz, den ich gedacht wurde, den Wert in eine Zeichenfolge zu lesen, Entfernen des ersten Zeichens und dann Konvertieren in ein Double. Aber ich habe das Gefühl, dass diese Methode ineffizient ist und es gibt eine bessere Methode. Irgendwelche Tipps? Vielen Dank!

+7

Das hört sich nach einer kleinen Ineffizienz an, um die man sich keine Sorgen machen sollte :) –

+1

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

+0

Nebenbei: Fließkomma-Variablen und Währung kommen nicht sehr gut miteinander aus. – edmz

Antwort

4

Ich stimme Magnus zu: das scheint gering. Aber wenn Sie es wirklich tun wollen, lesen Sie einfach ein Zeichen dann ein Doppel lesen:

char ch; 
double d; 
std::cin >> ch >> d; 
+0

Ich dachte daran, das zu tun, aber ich dachte, es würde versuchen, die ganze Zeichenfolge irgendwie als ein Zeichen einzulesen, was es ungültig machen würde. Ist es nicht wichtig, dass zwischen dem $ und dem Betrag kein Leerzeichen ist? – Sam

+1

Nevermind, ich habe es gerade getestet, danke! – Sam

2
if(stream.peek() == '$') stream.get(); 
stream >> amount; 
+0

Ich werde wahrscheinlich den Scheck nicht brauchen, da die Eingabe versprochen wird, gut formatiert zu sein, aber das würde funktionieren, danke! – Sam

+0

gute Antwort. Wenn Sie das ** if (stream.peek() == '$') ** zu einem ** while (stream.peek() == '$') ** machen, wird sichergestellt, dass eine beliebige Anzahl von ' $ 'aus dem Stream vor dem Lesen der Nummer. –

+0

Lass es uns wirklich schwer machen! 'für (char c = stream.peek();! (c == '-' || c == '.' || std :: isdigit (c)); c = stream.peek()) stream.get(); ' – bipll

1

Wenn Sie scanf statt cin, können Sie die $ fallen, wenn Sie wissen, es wird immer da sein und schreibe die Informationen direkt in einen Float.

float d; 
scanf("$%f", d); 
+0

Das funktioniert auch, danke! – Sam

1

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

+0

Gotcha, ich glaube, ich bleibe bei einer der ersten paar Lösungen, aber es ist gut zu wissen, dass so etwas existiert! Vielen Dank! – Sam

Verwandte Themen