Laden...

[gelöst] FormatException beim Behandeln und Konvertieren von Währungswerten

Erstellt von MrChangeLog vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.388 Views
MrChangeLog Themenstarter:in
121 Beiträge seit 2016
vor 7 Jahren
[gelöst] FormatException beim Behandeln und Konvertieren von Währungswerten

Ich habe vor einiger Zeit als Übung einen Kaffeautomaten programmiert (mit ASP.Net Webforms (ja ich weiss, ist veraltet)). Da ein (Mit-)Lehrling nun die gleiche Übung machen muss wollte ich mir meinen Automaten nochmal ansehen. Dabei stiess ich auf eine FormatException. Ich verstehe aber nicht, warum diese auftritt. Als ich das Programm das letzte mal verwendet habe lief es problemlos und ich habe seither nichts geändert.

Ich habe dort folgenden Code:


Single Anzahlung = 0;
string labeltext = lblPreis.Text;
Single textboxtext = Convert.ToSingle(TbBezahlt.Text);
char[] eliminator = { ' ' };
string[] preis_solo = labeltext.Split(eliminator);
Single kaffepreis = Convert.ToSingle(preis_solo[0]);

lblPreis.Text kann drei mögliche Werte haben: "CHF 1.50", "CHF 1.80" oder "CHF 2.00".
Dementsprechend ist preis_solo[0] "1.50", 1.80" oder "2.00".

Die Fehlermeldung lautet:

Fehlermeldung:
In System.FormatException ist eine Ausnahme vom Typ "mscorlib.dll" aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet.

Zusätzliche Informationen: Die Eingabezeichenfolge hat das falsche Format.

Hat jemand ne Idee, wo der Fehler liegt? Ich komme einfach nicht darauf. Ich habe auch schon "kaffepreis" als Double definiert (und dem entsprechend Convert.ToDouble).

3.003 Beiträge seit 2006
vor 7 Jahren

Liegt daran, dass die Eingabezeichenfolge das falsche Format hat 😉.

Oder anders: deine verwendete Kultur Konvertiert Bruchzahlen mit einem Komma. Du hast sie aber in deinen Zeichenfolgen mit Punkt dargestellt. Für die Konvertierung solltest du mitteilen, dass du gern eine Kultur verwenden willst, die einen Punkt als Dezimaltrenner verwendet.


Convert.ToSingle(mystring, CultureInfo.InvariantCulture);

LaTino
EDIT: zu spät gesehn. Was t0ms3n sagt, natürlich m(

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

16.827 Beiträge seit 2008
vor 7 Jahren

In welcher Zeile bekommst Du den Fehler?
Via Debugging angeschaut, was wirklich in den Variablen steht?

Bei Preisen bzw. Geld sollte man immer mit Decimal arbeiten. Single (float) ist wiederum genau das, was man nicht nehmen sollte.

Edit: Latino wird mit seiner Vermutung sehr wahrscheinlich recht haben.

T
314 Beiträge seit 2013
vor 7 Jahren

Unabhängig davon ist preis_solo[0] nicht der Preis sondern "CHF". Das wird deine Formatexception erklären.

MrChangeLog Themenstarter:in
121 Beiträge seit 2016
vor 7 Jahren

Danke @LaTino, jetzt funktioniert es.
Ich habe auch eine Vermutung, warum es früher funktionierte:
Als ich das Programm schrieb, arbeitete ich mit der englischen Version vom VisualStudio und dort wird offensichtlich der Punkt als Dezimaltrennzeichen verwendet.
Nun habe ich aber die deutsche Version, bei der eben das Komme der Dezimaltrenner ist.

MrChangeLog Themenstarter:in
121 Beiträge seit 2016
vor 7 Jahren

Unabhängig davon ist preis_solo[0] nicht der Preis sondern "CHF". Das wird deine Formatexception erklären.

Sorry, habe da was falsch angegeben. Bei lblPreis.Text kommt natürlich erst die Zahl und dann das "CHF" 😁

MrChangeLog Themenstarter:in
121 Beiträge seit 2016
vor 7 Jahren

PS: @Abt: habe deinen Einwand betreffend dem Datentyp beherzigt und verwende nun Decimal 🙂