Autor Beitrag
Csharp-programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
string value = "1.05";
double number;
if (Double.TryParse(value, out number))
{
   // hier enthält number den Wert als double
}
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: 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?