Autor |
Beitrag |
Csharp-programmierer
      
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: Do 24.12.15 15:53
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
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 24.12.15 16:36
Bestimmte Zeichen haben bei der Mask eine besondere Bedeutung.
Komma ist immer das Tausendertrennzeichen egal welches es dann wirklich in der aktuellen Kultur ist.
Punkt ist immer der Dezimaltrenner egal welches es dann wirklich in der aktuellen Kultur ist.
Am besten nochmal in der Hilfe nachlesen (insbesondere denn Teil unter Remarks mit den Zeichenbedeutungen).
Für diesen Beitrag haben gedankt: Palladin007
|
|
Csharp-programmierer 
      
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Di 29.12.15 18:51
OnTextChanged hätte ich auch gesagt, aber Ralf wäre schneller
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 
      
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 29.12.15 19:14
Bei einem out Parameter 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 
      
Beiträge: 696
Erhaltene Danke: 10
Windows 8.1
C# (VS 2013)
|
Verfasst: 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?
|
|