AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)?

Ein Thema von Der_Ventilator · begonnen am 17. Dez 2005 · letzter Beitrag vom 28. Dez 2005
Antwort Antwort
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#1

Re: Wie logisch richtig sortieren: 1,2,3,21 (nicht 1,2,21,3)

  Alt 25. Dez 2005, 18: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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:40 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