Registriert seit: 18. Mär 2005
1.682 Beiträge
Delphi 2006 Enterprise
|
Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)
25. Dez 2005, 19:09
Hallo,
Zitat von Der_Ventilator:
Nur leider funktioniert sie überhaupt nicht.
Sie bewertet immer noch '2' größer als '14'.
Wenn Du meinem Link folgtest, würdest Du am Ende der Seite ein Archiv finden, in dem eine funktionierende Funktion steckt. Aber für Dich füge ich sie hier mal ein:
Delphi-Quellcode:
function NatCompare(const Item1, Item2: WideString): Integer;
var
Start1, Start2: Integer;
S1, S2: WideString;
N1, N2: Boolean;
function IsDigit(const C: WideChar): Boolean;
begin
Result := (C in [WideChar('0')..WideChar('9')]);
end;
function GetNext(const S: WideString; var Start: Integer;
var IsNumber: Boolean): WideString;
var
Len,
Laenge,
C: Integer;
begin
Len := Length(S);
if Start > Len then
begin
Result := '';
Exit;
end;
// Beginnt eine Zahl?
IsNumber := IsDigit(S[Start]);
Laenge := 1;
for C := Start + 1 to Len do
begin
// Weiterhin eine Zahl/ein Wort?
if IsDigit(S[C]) = IsNumber then
Inc(Laenge)
else
Break;
end;
Result := Copy(S, Start, Laenge);
Inc(Start, Laenge);
end;
begin
Result := 0;
// Beide gleich -> Raus hier
if Item1 = Item2 then
Exit;
Start1 := 1;
Start2 := 1;
// Alle Teile durchgehen
repeat
// Teile holen
S1 := GetNext(Item1, Start1, N1);
S2 := GetNext(Item2, Start2, N2);
// Haben wir zwei Zahlen?
if N1 and N2 then // Ja -> Zahlen Vergleichen
Result := StrToInt(S1) - StrToInt(S2)
else // Nein -> Normaler Stringvergleich
Result := WideCompareStr(S1, S2);
until (Result <> 0) or
(Start1 > Length(Item1)) or
(Start2 > Length(Item2));
end;
Gruß
xaromz
|
|
Zitat
|