Hi,
diese Funktion liefert folgendes Ergebnis:
V1 < V2 -> -1
V1 = V2 -> 0
V1 > V2 -> 1
und zwar immer wenn die einzelnen Versions-Zahlen nicht größer sind, als in ein integer passt.
Wer es grösser mag und braucht, kann ja auch int64 nehmen.
Die Funktion stammt aus einem Projekt von mir, wo ich in einem VirtualStringTree u.a. nach Versions-Nummern sortieren lassen will.
Klappt übrigens auch hervorragend mit
IP-Adressen (verwende ich in dem geleichen Projekt auch dafür)
cu
Oliver
Delphi-Quellcode:
function VersionCompareStr(const V1, V2 : string) : integer;
var
tvSL,
cvSL : TStrings;
i : integer;
equal : boolean;
tV1, tV2 : string;
begin
tvSL := TStringList.Create;
cvSL := TStringList.Create;
try
tV1 := V1;
tV2 := V2;
tV1 := StringReplace( tV1, ',', '.', [ rfReplaceAll ] );
tV2 := StringReplace( tV2, ',', '.', [ rfReplaceAll ] );
tV1 := StringReplace( tV1, '_', '.', [ rfReplaceAll ] );
tV2 := StringReplace( tV2, '_', '.', [ rfReplaceAll ] );
tvSL.Delimiter := '.';
cvSL.Delimiter := '.';
tvSL.DelimitedText := tV1;
cvSL.DelimitedText := tV2;
while tvSL.Count < cvSL.Count
do
tvSL.Add( '0' );
while cvSL.Count < tvSL.Count
do
cvSL.Add( '0' );
i := 0;
RESULT := 0;
equal := true;
while ( i < tvSL.Count ) and equal
do begin
equal := StrToIntDef( tvSL.Strings[ i ], 0 ) = StrToIntDef( cvSL.Strings[ i ], 0 );
if not equal
then
if StrToIntDef( tvSL.Strings[ i ], 0 ) < StrToIntDef( cvSL.Strings[ i ], 0 )
then
RESULT := -1
else
RESULT := 1;
Inc( i );
end;
finally
FreeAndNil( tvSL );
FreeAndNil( cvSL );
end;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)