Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln? (https://www.delphipraxis.net/104177-zeichenkette-pruefen-ob-gueltige-zahl-ohne-umwandeln.html)

Amateurprofi 30. Nov 2007 11:41

Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
 
Na, dann will ich auch noch mal was beisteuern.
Dürfte um ca. 25 % schneller sein als optimale Pascal-Lösungen

Als gültig werden Strings erkannt, die
a) nur Ziffern enthalten, aber mindestens eine Ziffer
b) als erstes Zeichen ein Vorzeichen haben, dem mindestens eine Ziffer folgt

Delphi-Quellcode:
FUNCTION IsSignedInteger(s:string):boolean;
asm
            test eax,eax
            je   @Exit      // s=NIL
            cmp [eax-4],0 // geändert auf Wunsch des Erstellers
            je   @Fail      // s hat Länge 0
            mov  edx,eax
            mov  ax,[edx]   // AL=erstes Zeichen, AH=zweites Zeichen
            add  edx,2
            cmp  al,'-'
            je   @HasSign
            cmp  al,'+'
            jne  @NoSign
@HasSign:  add  ah,$D0
            sub  ah,$0A
            jb   @Loop      // Nach Sign folgt Ziffer
@Fail:     xor  eax,eax    // Fehler
            jmp  @Exit
@NoSign:   add  al,$D0
            sub  al,$0A
            jae  @Fail      // erstes Zeichen nicht '0'..'9','-','+'
            jmp  @Entry
@Loop:     mov  ax,[edx]
            add  edx,2
            add  al,$D0
            sub  al,$0A
            jae  @CheckEnd  // nicht '0'..'9'
@Entry:    add  ah,$D0
            sub  ah,$0A
            jb   @Loop      // ist '0'..'9'
            sub  ah,$D0-$0A
            je   @True      // Ist 0 Byte (Ende vom String)
@CheckEnd: sub  al,$D0-$0A
@True:     sete al
@Exit:
end;
[edit=MrSpock]3. ASM Befehl auf Wunsch des Erstellers geändert. Mfg, MrSpock[/edit]

himitsu 30. Nov 2007 19:08

Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
 
@LoCrux: OK, wenn wirklich nur Zahlen und Buchstaben drin sind, dann sag ich nichts dagegen :angel:

LoCrux 30. Nov 2007 23:43

Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
 
@Amateurprofi:

SPEEDFREAK

:chat: :bouncing4: :bounce1: :bounce2: :bouncing4: :bounce1: :bounce2: :bouncing4: :bounce1: :bounce2: :bouncing4: :bounce1: :bounce2:

SvenLittkowski 7. Feb 2011 05:29

AW: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
 
Und wie kann man testen ob ein String eine Zahl darstellt, wenn jene Zahlen auch negativ (mit vorangestelltem Minus) sein können und vom Typ Integer oder Real sein können (also mit Kommastellen, wobei das Komma je nach Land durch ein Komma oder einen Punkt dargestellt sein kann)? Gleichzeitig will ich aber Strings wie die nachfolgenden "Un"-Zahlen ausschließen:
- "12-3"
- "123-"
- "123."
- "1.2.3"
- "1-2-3"
- "-.-"

Bei meinem Problem kann ich mit Schleifen arbeiten. Nur der Algorithmus fällt mir nicht ein.

himitsu 7. Feb 2011 09:57

AW: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
 
Das Einfachste: Delphi-Referenz durchsuchenVal, Delphi-Referenz durchsuchenTryStrToInt, Delphi-Referenz durchsuchenTryStrToFloat, ...

Delphi-Referenz durchsuchenDecimalSeparator

Ansonsten einfach alles nacheinander prüfen und schauen, ob was Richtiges/Falsches drin vorkommt.
Delphi-Quellcode:
Result := False;
i := 1;
if (i <= Length(S)) and (S[i] in ['+', '-']) then
  Inc(i);
if (i > Length(S)) or not (S[i] in ['0'..'9']) then
  Exit;
while (i <= Length(S)) and (S[i] in ['0'..'9']) do
  Inc(i);
if (i <= Length(S)) and (S[i] = DecimalSeparator) then
begin
  Inc(i);
  if (i > Length(S)) or not (S[i] in ['0'..'9']) then
    Exit;
  while (i <= Length(S)) and (S[i] in ['0'..'9']) do
    Inc(i);
end;
Result := i > Length(S);
Das läßt sich natürlich noch ein bissl hübscher zusammenfassen.

DeddyH 7. Feb 2011 10:02

AW: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
 
http://www.delphipraxis.net/158131-t...tige-real.html

Deep-Sea 7. Feb 2011 10:02

AW: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
 
@himitsu & alle anderen:
Das Post von SvenLittkowski wurde von ihm auch in einem eigenen Thread gepostet, der unter dem Namen Test ob gültige REAL zu finden ist :-D

PS: Ach DeddyH ...... :p


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:58 Uhr.
Seite 3 von 3     123   

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