Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Prüfen ob (Ganz-)Zahl (https://www.delphipraxis.net/13459-pruefen-ob-ganz-zahl.html)

chris_82 18. Dez 2003 21:27


Prüfen ob (Ganz-)Zahl
 
Wie prüfe ich bei oder nach der Eingabe in ein Editfeld, ob auch wirklich nur eine Zahl eingegeben wurde, welche auch keine Nachkommastellen habe sollte.

BungeeBug 18. Dez 2003 21:37

Re: Prüfen ob (Ganz-)Zahl
 
Hi,

recht einfach.

Delphi-Quellcode:

IF (POS('.',Edit1.Text) OR POS(',',Edit1.Text)) <> 0 THEN
 BEGIN
  ShowMessage('zahl mit Nachkommastelle!');
 END
ELSE
 BEGIN
  ShowMessage('Keine Nachkommastelle!');
 END;

chris_82 18. Dez 2003 21:41

Re: Prüfen ob (Ganz-)Zahl
 
ok, so prüf ich ob irgendwo ein komma oder punkt ist, so würde ich rausbekommen ob es sich um ein ganzzahl oder nicht handelt, aber wie bekomme ich erst mal raus, bzw. wie verhindere ich, dass es sich auch um eine zahl handelt, bzw. das text eingegeben wird?

Robert_G 18. Dez 2003 21:46

Re: Prüfen ob (Ganz-)Zahl
 
So müsste es eigentlich klappen.

Delphi-Quellcode:
  For i := 1 to Length(Edit1.Text) Do
   If not(Edit1.Text[i] in [#48..#57]) Then
     Irgendwas...

Highman72 19. Dez 2003 01:48

Re: Prüfen ob (Ganz-)Zahl
 
Hi!

:angle: Verhindere doch einfach die Eingabe anderer Tasten außer Ziffern und Tab/Enter usw. Dann hast Du garantiert nur Ganzzahlen im Feld!

Schöne Grüße,
Jens Eppler
Bad Schwalbach

PS: Schöne Grüße nach Sömmerda!

MikeS 19. Dez 2003 05:53

Re: Prüfen ob (Ganz-)Zahl
 
Moin

Mit dem Befehl val kannst du einen String in eine Zahl umwandeln!

Code:
 
...
var zahl: integer;
    code: integer;
begin
val(edit1.text, zahl, code);
...
wenn du zahl als integer deklarierst dann ist code immer dann null wenn dein String eine Zahl ist
die dem Typ Integer entspricht!

Code:
 
...
var zahl: real;
    code: integer;
begin
val(edit1.text, zahl, code);
...
Wenn du Zahl als z.B. real deklariest dann ist code auch dann null wenn z.b. "1.0" in deinem Edit steht!

=> mit code kannst du prüfen ob die Umwandlung erfolgreich war und wenn Sie es war dann stand eine
(Ganz-)Zahl in deinem Edit

Tonic1024 19. Dez 2003 08:19

Re: Prüfen ob (Ganz-)Zahl
 
Moin...

Die Variante von MikeS finde ich gut...

Der Auswahl-halber poste ich mal was ich immer benutze. Zugegeben nicht ganz so elegant, aber bewährt und Kampferprobt :wink:

Delphi-Quellcode:
function IsInteger(value : String): Boolean;
begin    
  Result:=true;
  try
    StrToInt(value)
  except
    Result:=false;
  end;
end;
Bis denne...

Tyrael Y. 19. Dez 2003 08:26

Re: Prüfen ob (Ganz-)Zahl
 
Wenn sowieso nur Ganzahlen einegegeben werden sollen
verwende am Besten den Vorschlag von Highman, dann brauchst du auch
nix zu prüfen

wenn auch was anderes eingegeben werden darf in das Editfeld und es
nur um die Prüfung geht, sind die anderen Varianten sinnvoll


Gruß

DevStar 19. Dez 2003 14:31

Re: Prüfen ob (Ganz-)Zahl
 
Hi,
falsche Eingaben abzufangen dürfte schwer werden. Stichwort Zwischenablage, Paste.

Die einzige vernünftige Möglichkeit ist die von MikeS. Die von Tonic1024 funktioniert zwar auch, ist aber bei ausgelöster Exception bedeutend langsamer. Durch Exceptions können durchaus mal eine halbe Million Taktzyklen verbraten werden, von daher sollte man sie - falls möglich - vermeiden.

MfG
DevStar

Tyrael Y. 19. Dez 2003 14:46

Re: Prüfen ob (Ganz-)Zahl
 
Zitat:

falsche Eingaben abzufangen dürfte schwer werden. Stichwort Zwischenablage, Paste.
Delphi-Quellcode:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
   if not(key in ['0'..'9']) then
      key := #0;
end;
Wieso soll das schwer sein? Oder ist dir das zu schwer?

Gruß

devnull 19. Dez 2003 14:47

Re: Prüfen ob (Ganz-)Zahl
 
Hi, du könntest das vll so machen:
Delphi-Quellcode:
   if zahl1 <> round (zahl1) then   // Zahl ist eine KommaZahl
   // zahl1 ist hier vom Typ real - Umwandlung davor mit try-except StrToFloat
Mit frac bekommste die Nachkommaziffern heraus...

devnull

Tyrael Y. 19. Dez 2003 14:51

Re: Prüfen ob (Ganz-)Zahl
 
Zitat:

Hi, du könntest das vll so machen:
Source:

if zahl1 <> round (zahl1) then // Zahl ist eine KommaZahl
// zahl1 ist hier vom Typ real - Umwandlung davor mit try-except StrToFloat


Mit frac bekommste die Nachkommaziffern heraus...

devnull
oh Mann
gut das ich sowas in unserem Code nicht sehe
mir stehen die Haare zu Berge

try except ist zur Feherbehandlung und nicht um einen Wert richtig zu stellen.
so ein Konstrukt funktioniert, sollte aber nie benutzt werden

Gruß

DevStar 19. Dez 2003 14:53

Re: Prüfen ob (Ganz-)Zahl
 
Zitat:

Zitat von Tyrael Y.
Wieso soll das schwer sein? Oder ist dir das zu schwer?

Und jetzt kopier mal einen Text in die Zwischenablage und füg ihn per Copy&Paste ein.
Strg+V ist zwar damit gesperrt, aber Shift+Einfg geht trotzdem noch, weil es für Einfg keinen ASCII-Code gibt, sondern nur einen Virtual Key Code.

PS: Nein, es ist nicht zu schwer. :wink:

MfG
DevStar

devnull 19. Dez 2003 14:55

Re: Prüfen ob (Ganz-)Zahl
 
Wieso soll es schlecht sein, einen TEXT(string) aus einem EDIT-Feld in einer try-except Behandlung zu konvertieren. Wenn da z. Bsp. Buchstaben enthalten sind, und ich habe diese Behandlung nicht, tritt doch eine AV ein, oder ? :gruebel:

Tyrael Y. 19. Dez 2003 14:57

Re: Prüfen ob (Ganz-)Zahl
 
@devstar was meinst du?
wo liegt das problem ? ich verstehe nicht ganz.
man kann es kopieren und auch mit shift+einfügen wieder einfügen

DevStar 19. Dez 2003 14:58

Re: Prüfen ob (Ganz-)Zahl
 
Zitat:

Zitat von devnull
Wenn da z. Bsp. Buchstaben enthalten sind, und ich habe diese Behandlung nicht, tritt doch eine AV ein, oder ? :gruebel:

Wenn überhaupt tritt ein EConvertError ein und keine AccessViolation.

Zitat:

Wieso soll es schlecht sein, einen TEXT(string) aus einem EDIT-Feld in einer try-except Behandlung zu konvertieren.
Weil es unnötig Rechenzeit verbraucht. Val ist bedeutend schneller und verursacht keine Exceptions.

MfG
DevStar

Tyrael Y. 19. Dez 2003 15:00

Re: Prüfen ob (Ganz-)Zahl
 
Zitat:

Wieso soll es schlecht sein, einen TEXT(string) aus einem EDIT-Feld in einer try-except Behandlung zu konvertieren. Wenn da z. Bsp. Buchstaben enthalten sind, und ich habe diese Behandlung nicht, tritt doch eine AV ein, oder ?
wie oben schon erwähnt:
Zitat:

Durch Exceptions können durchaus mal eine halbe Million Taktzyklen verbraten werden, von daher sollte man sie - falls möglich - vermeiden.
aus diesem Grunde und weil in try except ein Fehler behandelt werden soll, nicht eine Eingabe die man auch erwartet. Alle erwarteten Eingaben sollten mit if oder case Konstruktun gelöst werden.
So etwas sollte man nicht machen.

Gruß

DevStar 19. Dez 2003 15:01

Re: Prüfen ob (Ganz-)Zahl
 
Zitat:

Zitat von Tyrael Y.
@devstar was meinst du?
wo liegt das problem ? ich verstehe nicht ganz.
man kann es kopieren und auch mit shift+einfügen wieder einfügen

Ja. Das ist ja das Problem. Man kann u. a. auch Buchstaben "reinpasten".
Dann kann beim Konvertieren wieder eine Exception auftreten. (Falls man StrToInt verwendet)

Kurz gesagt, ich wollte nur zeigen, dass deine Aussage
Zitat:

Wenn sowieso nur Ganzahlen einegegeben werden sollen
verwende am Besten den Vorschlag von Highman, dann brauchst du auch
nix zu prüfen
falsch ist.
Val stellt die einzige vernünftige Methode zum Konvertieren dar.

MfG
DevStar

Tyrael Y. 19. Dez 2003 15:03

Re: Prüfen ob (Ganz-)Zahl
 
@devstar aso das meinst du, ok das ist richtig

chris_82 19. Dez 2003 15:11

Re: Prüfen ob (Ganz-)Zahl
 
Ok, ich hab die Variante mit Val genommen, nachdem ich von Luckie ein aufs Dach bekommen hab :cry:.

Hätte ja nicht gedacht, das so ein Problem doch so stark in der DP diskutiert wird, das gefällt mir :-D

Danke euch allen.

:xmas: :xmas: Wünsch euch schon mal ein schönes :xmas: Fest :xmas: und einen guten Rutsch, da ich nicht weiß ob ich es schaffe in den nächsten Tagen wieder bei DP vorbei zu schauen! :xmas: :xmas:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz