Überprüfung von Eingabezahlen

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
heizkoerper
Beiträge: 24
Registriert: Mo 1. Aug 2011, 14:39
OS, Lazarus, FPC: Windows XP und 7, L 0.9.31, FPC 2.4.4
CPU-Target: 32 und 64 Bit
Wohnort: Hannover
Kontaktdaten:

Überprüfung von Eingabezahlen

Beitrag von heizkoerper »

Guten Morgen Lazarus-Freunde,

ich lese öfters, dass es Probleme mit der Überprüfung von Eingabezahlen gibt.

Ich arbeite seit Jahren mit meiner eigenen Überprüfungsfunktion.

Die sieht wie folgt aus:

Code: Alles auswählen

Function StringWert(Wert:String;Min,Max:Extended):Extended;
Const ErgebnisFalsch=1E100;
Var    i                :Byte;
         FehlerStelle:Integer;
         Zahl           :Extended;
Begin
 For i:=1 To Length(Wert) Do If Wert[i]=',' Then Wert[i]:='.';
 Val(Wert,Zahl,FehlerStelle);
 If (FehlerStelle>0) Or (Zahl<Min) Or (Zahl>Max) Then StringWert:=ErgebnisFalsch Else StringWert:=Zahl
End;

Mit dieser Funktion lassen sich leicht Eingabefehler aufspüren.


Gruß Heizkoerper
Zuletzt geändert von Lori am Fr 15. Jun 2012, 17:30, insgesamt 1-mal geändert.
Grund: Es lässt sich auch ganz leicht der Highlighter benutzen. ;) SCNR

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Überprüfung von Eingabezahlen

Beitrag von indianer-frank »

Mit dieser Funktionen lassen sich aber auch leicht Fehler einbauen :o

1. Wenn jemand (warum auch immer) eine Zahl mit Tausenderseparator ',' und Dezimalseparator '.' eingibt (zB 1,345.678), liefert val einen Fehlercode.

2. (Intel-)Extended geht bis 1e4932, Dein 'ungültiger Wert' ist also gerade mal 2% des größten Wertes, was soll das Ergebnis 1e100 also bei einem Aufruf x := StringWert('1.2e300',0,1e200); bedeuten? Für solche Zwecke gibt es übrigens NaNs.

3. Im Code solltest Du unabhängig von den anderen Punkten die Variable i nicht als Byte deklarieren, sonst gibt's Probleme mit Stringlängen > 255.

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Überprüfung von Eingabezahlen

Beitrag von carli »

heizkoerper hat geschrieben:Guten Morgen Lazarus-Freunde,

ich lese öfters, dass es Probleme mit der Überprüfung von Eingabezahlen gibt.

Ich arbeite seit Jahren mit meiner eigenen Überprüfungsfunktion.

Die sieht wie folgt aus:

Function StringWert(Wert:String;Min,Max:Extended):Extended;
Const ErgebnisFalsch=1E100;
Var i :Byte;
FehlerStelle:Integer;
Zahl :Extended;
Begin
For i:=1 To Length(Wert) Do If Wert[i]=',' Then Wert[i]:='.';
Val(Wert,Zahl,FehlerStelle);
If (FehlerStelle>0) Or (Zahl<Min) Or (Zahl>Max) Then StringWert:=ErgebnisFalsch Else StringWert:=Zahl
End;

Mit dieser Funktion lassen sich leicht Eingabefehler aufspüren.


Gruß Heizkoerper


Warum nutzt du kein FloatToStrF inklusive try..except-Block?

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Überprüfung von Eingabezahlen

Beitrag von Socke »

indianer-frank hat geschrieben:3. Im Code solltest Du unabhängig von den anderen Punkten die Variable i nicht als Byte deklarieren, sonst gibt's Probleme mit Stringlängen > 255.

Dann direkt den Hinweis hinterher, dass SizeInt der beste Typ für die Längen von Strings und Arrays ist -- immer dann, wenn man ein paar Bytes direkt im Speicher bearbeiten möchte.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

heizkoerper
Beiträge: 24
Registriert: Mo 1. Aug 2011, 14:39
OS, Lazarus, FPC: Windows XP und 7, L 0.9.31, FPC 2.4.4
CPU-Target: 32 und 64 Bit
Wohnort: Hannover
Kontaktdaten:

Re: Überprüfung von Eingabezahlen

Beitrag von heizkoerper »

Vielen Dank für die Hinweise.

Natürlich läßt sich auch FloatToStrF inklusive eines try..except-Blockes benutzen.

Ich bin halt noch ein alter Pascal-Fan.

Die Procedure Val(Wert,Zahl,FehlerStelle) hat aber den großen Vorteil, dass die Stelle des Fehlers angegeben wird.

Dies ist bei bestimmten Eingabeüberprüfungen (z.B. einer Formelauswertung) von großem Nutzen.

Ich hatte als Fehlerwert Const ErgebnisFalsch=1E100 deklariert.

Mir ist schon bekannt, dass Extended-Zahl einen weitaus höheren Exponenten darstellen können.

Mit Delphi arbeite ich auch mit weitaus höheren Werten, wie z.B. 1E1000.

Mache ich dies bei Lazarus und kontrolliere ich den Wert, so erscheint ErgebnisFalsch=inf

Gruß Heizkoerper

Antworten