Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   StrToInt löst keine exception aus (https://www.delphipraxis.net/65244-strtoint-loest-keine-exception-aus.html)

sakura 14. Mär 2006 12:24

Re: StrToInt löst keine exception aus
 
Hier mal die nötigen Codes, damit keine Hex-Werte als Ergebnis zugelassen werden ;-)
Delphi-Quellcode:
function ValNoHex(const s: String; var code: Integer): Longint;
var
  I: Integer;
  Negative: Boolean;
begin
  I := 1;
  code := -1;
  Result := 0;
  Negative := False;

  while (I <= Length(s)) and (s[I] = ' ') do
    Inc(I);

  if I > Length(s) then Exit;
  case s[I] of
    '-': begin
      Negative := True;
      Inc(I);
    end;
    '+': begin
      Inc(I);
    end;
  end;

  while I <= Length(s) do
  begin
    if (Result > (High(Result) div 10)) or (not (s[I] in ['0'..'9'])) then
    begin
      code := I;
      Exit;
    end;
    Result := Result * 10 + Ord(s[I]) - Ord('0');
    Inc(I);
  end;
  if Negative then
  begin
    Result := -Result;
  end;
  code := 0;
end;

function StrToIntNoHex(S: string): Longint;
var
  E: Integer;
begin
  Result := ValNoHex(S, E);
  if E <> 0 then raise EConvertError.CreateResFmt(@SInvalidInteger, [S]);
end;

function StrToIntDefNoHex(S: string; Default: LongInt): Longint;
var
  E: Integer;
begin
  Result := ValNoHex(S, E);
  if E <> 0 then
    Result := Default;
end;
Anstatt StrToInt und StrToIntDef nutze StrToIntNoHex und StrToIntDefNoHex :)

...:cat:...

Hawkeye219 14. Mär 2006 13:42

Re: StrToInt löst keine exception aus
 
Kleine Ergänzung:

Einige Zahlen außerhalb des Long-Bereichs werden nicht zurückgewiesen sondern falsch konvertiert. Die Abfrage

Code:
if (Result > (High(Result) div 10)) or (not (s[I] in ['0'..'9'])) then
greift erst ab dem Wert 2147483650, der Long-Bereich ist aber [-2147483648..2147483647].
Borland hat dies in der Systemroutine _ValLong (im Assembler-Teil!) durch eine Abfrage des Overflow-Flags kompensiert.

Der Fehler tritt aber lediglich an den Intervallrändern auf und dürfte nur für die Anwendungsfälle interessant sein, in denen der Long-Bereich exakt abgedeckt werden soll.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 Uhr.
Seite 2 von 2     12   

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