Entwickler-Ecke
WinForms - Falscher Ausgabewert einer MaskedTextBox
Csharp-programmierer - Do 24.12.15 15:53
Titel: Falscher Ausgabewert einer MaskedTextBox
Hallo meine Lieben. Ich bin gerade dabei ein Rechenprogramm zu schreiben. Dazu habe ich eine MTB mir der Mask: 00,00.
Wenn ich nun z.B. 20,00 eingebe, und den Wert über MTB.Text ausgeben lasse, kommt dort 2000 raus. Er beachtet das Komma gar nicht. Aber warum?
Palladin007 - Do 24.12.15 15:59
Ich tippe mal darauf, es liegt an der aktuellen Culture.
Die CultureInfo.InvariantCulture (die ist Standart) hat Punkt als Dezimal-Trennzeichen, das Komma ist das Tausender-Trennzeichen und wird dann vermutlich einfach nur ignoriert.
Csharp-programmierer - Di 29.12.15 11:51
Es haut jetzt hin. Ich habe jetzt folgende Maske gewählt: 99999,00
Zur Info: Das Programm soll meine Finanzen verwalten per ListView. Mein Problem jedoch ist nun, dass man nicht immer Geld im Wert von Zehntausendern draufzahlt / abhebt. Angenommen ich zahle nun 100€ ein, muss ich in die MaskedTextBox 00100,00 eingeben. In der ListView sieht es jedoch dann komisch aus wenn erst der Betrag nach den ganzen Nullen steht. Gibt es an der MaskedTextBox irgendeine Eigenschaft, dass man 100,00 eingibt und dann die Stellen links leer bleiben?
Ralf Jansen - Di 29.12.15 14:52
Ich würde prinzipiell ein MaskEdit für solche Zahleneingaben für ungeeignet halten. Die eignet sich vielleicht für bestimmte stark formatierte Dinge (Ausweisnummern, Kreditkartennummern, Sozialversicherungsnummern etc.) für Zahlen würde ich aber eher eine normale TextBox nehmen und die Eingabemöglichkeiten entsprechend einschränken.
Das ist eigentlich eine nette kleine Programmieraufgabe der du dich stellen könntest, eine Ableitung einer Textbox schreiben die nur Zahleneingaben zulässt. Wenn du dich aber ein bisschen anders bemühst oder eher Goggle bemühst ;) wirst du unzählige Lösungen dazu im Netz finden. Ein reine Zahleneingabe-TextBox ist ein absoluter KLassiker.
Csharp-programmierer - Di 29.12.15 18:25
Ich habe Ihren Kommentar gerade gelesen und würde behaupten, dass man das Leave- Event nutzt und über einen Typ-Catch-Block eine Abfrage macht, ob man den Wert in Decimal Parsen kann. So kann man - denke ich - checken, ob in der TextBox nur Zahln sind.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| try { Decimal.Parse(this.tb_betrag.Text); } catch { MessageBox.Show("Im Betragsfeld wurde ein ungültiges Zeichen gefunden"); } |
Ralf Jansen - Di 29.12.15 18:38
Zitat: |
Ich habe Ihren Kommentar gerade gelesen und würde behaupten, dass man das Leave- Event nutzt und über einen Typ-Catch-Block eine Abfrage macht, ob man den Wert in Decimal Parsen kann. So kann man - denke ich - checken, ob in der TextBox nur Zahln sind. |
Es gibt tausend Wege. OnLeave wär mir persönlich viel zu spät. Ich würde eher bei OnKeyPress und/oder OnTextChanged ansetzen.
Palladin007 - Di 29.12.15 18:51
OnTextChanged hätte ich auch gesagt, aber Ralf wäre schneller :D
Dazu muss ich aber nich ergänzen:
Versuche von möglich Exceptions zu vermeiden, die sind langsam und meistens nicht notwendig.
Besser wäre in deinem Fall die TryParse-Methode, viele zentrale Typen in .NET (int, double, DateTime, etc.) haben die
Csharp-programmierer - Di 29.12.15 19:06
Vielen Dank euch beiden. Aber warum gibt die Methode TryParse einen boolischen Wert zurückt? Und was heißt dieses out decimal2?
Also was bewirkt das?
Ralf Jansen - Di 29.12.15 19:14
Bei einem
out Parameter [
https://msdn.microsoft.com/de-de/library/8f1hz171.aspx] kommen Daten raus ;) Heißt der Inhalt der Variablen hat sich nach dem aufrufen geändert.
TryParse liefert als Boolean ob der übergebene Wert als Zieltyp darstellbar ist und der out Parameter enthält dann den geparsten Wert.
Das Muster wäre also ein simples
C#-Quelltext
1: 2: 3: 4: 5: 6:
| string value = "1.05"; double number; if (Double.TryParse(value, out number)) { } |
Csharp-programmierer - Di 29.12.15 19:52
Ich habe diesen Code jetzt in das TextChange- Ereignis geschrieben. Oder soll ich es lieber in das selbst geschriebene delegate event schreiben, damit die Daten auf die ListView übertrage werden?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!