Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.069 Beiträge
 
Delphi 12 Athens
 
#16

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

  Alt 29. Nov 2007, 18:13
@LoCrux:
es stimmt schon das wenn Bit 6 nicht gesetzt ist daß es eine Zahl sein könnte, aber es muß dennoch keine Zahl sein (ih weiße da nur mal auf die ganzen Steuerzeichen #0..#31 hin),
also einfach nur Bit 6 zu Prüfen reicht nicht aus.

@Reinhard Kern:
Zitat:
Nebenbedingungen sind z.B. dass + und - nur am Anfang auftreten dürfen
tut es doch ... siehe (i = 1)

@Popov: hast schon Recht (es funktioniert zwar, aber wenn die 2 Assembleranweisungen je durchgang für i=1 gesparrt würde, dann wär's schon etwas optimaler)

Und es wäre bestimmt nicht schlecht, wenn bei Auffinden eines unzuläßigen Zeichens die Schleife abgebrochen (siehe Break) würde
Delphi-Quellcode:
B := (S <> '') and (S[1] in ['+', '-', '0'..'9']);
For i := 2 to Length(S) do
  If not (S[i] in ['0'..'9']) Then Begin
    B := False;
    Break;
  End;

If B Then {istZahl}
ein Punkt war zwar nicht mit in der "Aufgabenstellung" zu erkennen, aber was soll's:
Delphi-Quellcode:
B := (S <> '') and (S[1] in ['+', '-', '0'..'9']);
B2 := True;
For i := 2 to Length(S) do
  If not (S[i] in ['0'..'9']) Then
    If B2 and (S[i] = '.') and (i < Length(S)
      and (S[i - 1] in ['0'..'9'])
      and (S[i + 1] in ['0'..'9']) Then
      B2 := False
    Else Begin
      B := False;
      Break;
    End;

If B Then {istZahl}
oder
Delphi-Quellcode:
B := (S <> '') and (S[1] in ['+', '-', '0'..'9']);
B2 := True;
For i := 2 to Length(S) do
  If not (S[i] in ['0'..'9']) Then
    If B2 and (S[i] = '.') and (i < Length(S))
      and ((i > 2) or (S[1] in ['0'..'9'])) Then
      B2 := False
    Else Begin
      B := False;
      Break;
    End;

If B Then {istZahl}
oder das vorherigge nochmal mit PChar
Delphi-Quellcode:
Var P: PChar;
  i, i2: Integer;
  B, B2: Boolean;
i2 := Length(S);
P := PChar(S);
B := (i2 <> 0) and (P^ in ['+', '-', '0'..'9']);
B2 := True;
For i := 2 to i2 do Begin
  Inc(P);
  If not (P^ in ['0'..'9']) Then
    If B2 and (P^ = '.') and (i < i2)
      and ((i > 2) or (S[1] in ['0'..'9'])) Then
      B2 := False
    Else Begin
      B := False;
      Break;
    End;
End;

If B Then {istZahl}
(ich hoffe letzteres stimmt ... hab's jetzt nur aus'm Kopf umgeschrieben und nicht getestet)

und hier nochmal die PChar-Variante ohne Punkt:
Delphi-Quellcode:
Var P: PChar;
  i, i2: Integer;
  B, B2: Boolean;
i2 := Length(S);
P := PChar(S);
B := (i2 <> 0) and (P^ in ['+', '-', '0'..'9']);
For i := 2 to i2 do Begin
  Inc(P);
  If not (P^ in ['0'..'9']) Then Begin
    B := False;
    Break;
  End;
End;

If B Then {istZahl}
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat