[solved]Windows.Forms-Taschenrechner: Komma wird in Berechnung nciht mit einbezogen.
-
Hallo!
Im Laufe meines momentanen Praktikums bin ich dabei, einen Taschenrechner mit Windows.Forms zu basteln. Allerdings wird das ausgelesene Komma* nicht mit in die Berechnung einbezogen, sondern stattdessen scheinbar ignoriert.
* welches natürlich vorher in einen Punkt umgewandelt wird.
Beispiel:
6 * 0.2 ergibt als Ergebnis 12.Ich mutmaße, dass der Kode nicht vollständig geparst wird, zumindest nicht an der entsprechenden Stelle.
Habt ihr Ideen, fällt euch was auf?
Vielen Dank im Voraus!
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace TR2 { public partial class Form1 : Form { double? zahl1, zahl2; bool neueZahl = true; //Funktion: Falls iein Rechenzeichen-Button gedrückt wird. double rzeichen() { if(zahl1 == null) zahl1 = double.Parse(this.eingabezeile.Text); neueZahl = true; return 0; } public enum operation { addieren, subtrahieren, multiplizieren, dividieren, modulo, keine } operation op = operation.keine; public Form1() { InitializeComponent(); } private void Form1_Enter(object sender, EventArgs e) { /* float[] zahl = null; zahl[i] = (float.Parse(eingabezeile.Text)); eingabezeile.Text = null;*/ ///zahl[0] = (Float.Parse(ergebnis.Text).ToString()); } private void bt_num_Click(object sender, EventArgs e) { //Falls iein Button gedrückt... if (neueZahl) { this.eingabezeile.Text = ((Button)sender).Text; neueZahl = false; } else this.eingabezeile.Text += ((Button)sender).Text; } private void Komma_Click(object sender, EventArgs e) { if (neueZahl) { this.eingabezeile.Text = "0"; this.eingabezeile.Text += "."; neueZahl = false; } else this.eingabezeile.Text += "."; } private void bt_geteilt_Click(object sender, EventArgs e) { rzeichen(); op = operation.dividieren; } private void bt_mal_Click(object sender, EventArgs e) { rzeichen(); op = operation.multiplizieren; } private void bt_minus_Click(object sender, EventArgs e) { rzeichen(); op = operation.subtrahieren; } private void bt_plus_Click(object sender, EventArgs e) { rzeichen(); op = operation.addieren; } private void gleich_Click(object sender, EventArgs e) { if (zahl1 != null && op != operation.keine) { zahl2 = double.Parse(this.eingabezeile.Text); } switch (op) { case operation.multiplizieren: eingabezeile.Text = (zahl1 * zahl2).ToString(); break; case operation.dividieren: eingabezeile.Text = (zahl1 / zahl2).ToString(); break; case operation.subtrahieren: eingabezeile.Text = (zahl1 - zahl2).ToString(); break; case operation.addieren: eingabezeile.Text = (zahl1 + zahl2).ToString(); break; case operation.modulo: eingabezeile.Text = (zahl1 % zahl2).ToString(); break; default: break; } } private void bt_modulo_Click(object sender, EventArgs e) { rzeichen(); op = operation.modulo; } } }
-
OK. Seltsamerweise funktioniert es korrekt, wenn ich direkt das Komma übernehme. Einer der Azubis meint, dass es evtl. damit zusammenhängen könnte, dass es eine Besonderheit von VS oder der deutschen Version von VS ist.
Könnt ihr mir die Geschichte mal genauer erklären?
-
Ich denke weniger die Besonderheit von VS sondern die Einstellung des Systems. Soweit ich weiß verwendet das .NET Framework das deutsche Zahlenformat - das heißt mit Komma als Dezimaltrennzeichen. Um da Probleme zu vermeiden würde ich einfach sowas wie
Convert.ToDouble(string, System.Globalization.NumberFormatInfo.InvariantInfo);
verwenden - dann hast du egal mit welchen Kultureinstellungen immer den Punkt als Dezimaltrennzeichen.
-
VS: 2010 Ultimate
Ich bin mir aber sicher, dass ich in 2009-2011 in meiner schulischen Berufsausbildung immer Punkte verwendet habe und VS war dort auch auf deutsch eingestellt.
War VS 200..8 glaube ich, wenn nicht 2003. Allerdings auch C++ und nicht C#. (Addendum: Und AFAIR war es auch nciht .NET damals)Mir liegt mittlerweile die Vermutung nahe, des es irgendetwas mit dem Parsing zu tun hat, sprich, dass Kommas nicht prinzipiell als Trennzeichen verwendet werden. Vermutlich hat das System/die IDE/der Compiler intern das Komma zum Punkt umgewandelt und umgekehrt.
-
Hallo Basinator,
DarkShadow hat schon die richtige Antwort gegeben - alternativ kannst du auch
Double.Parse(text, System.Globalization.NumberFormatInfo.InvariantInfo);
(bzw. noch besser die TryParse-Variante) benutzen.
Das .NET-Framework verwendet standardmäßig das Trennzeichen des eingestellten (Windows-)Systems, d.h. auf z.B. englischen Systemen den Punkt '.' und auf deutschen Systemen das Komma ',' (hat also nichts mit der IDE bzw. dem Compiler direkt zu tun).
Um die Spracheinstellungen bei .NET-Programmen umzustellen, gibt es die CultureInfo-Klasse, z.B.
Thread.CurrentThread.CurrentCulture = new CultureInfo("sv"); // schwedisch
s.a. Gewusst wie: Festlegen der Kultur und Benutzeroberflächenkultur für die Windows Forms-Lokalisierung.
Und unter http://www.csharp-examples.net/culture-names gibt es eine Übersicht über alle .NET Culture-Names.Unter C++ ist dagegen in der Standard-Lib generell der Punkt das Standardtrennzeichen (da es von Amis - bzw. in USA - entwickelt worden ist und Betriebssystem-unabhängiger ist) und man muß es explicit mittels 'locale' umstellen.
-
Hallo!
Vielen Dank für die Erklärung, nun weiß ich Bescheid.