![]() |
Re: StrToInt löst keine exception aus
Hier mal die nötigen Codes, damit keine Hex-Werte als Ergebnis zugelassen werden ;-)
Delphi-Quellcode:
Anstatt StrToInt und StrToIntDef nutze StrToIntNoHex und StrToIntDefNoHex :)
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; ...:cat:... |
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:
greift erst ab dem Wert 2147483650, der Long-Bereich ist aber [-2147483648..2147483647].
if (Result > (High(Result) div 10)) or (not (s[I] in ['0'..'9'])) then
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 03:18 Uhr. |
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