Zeichen ('.') aus string entfernen.

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Zeichen ('.') aus string entfernen.

Beitrag von mark332 »

Hi Leute,

ich schreibe derzeit an einem Programm, das auch eine Update-Funktion besitzen soll, dafür ist aber ein eindeutiges erkennen der Versions-Nummer erforderlich.

Mein Problem: Die Variablen "version" und "latest" (beide Strings) müssen verglichen werden, um festzustellen, ob eine neuere Version vorhanden ist.

Es würde reichen, aus der Versions-Nummer (Format: "X.X.X") die Punkte zu entfernen und dann nach

Code: Alles auswählen

 if (StrToInt(version) < StrToInt(latest)) then 
zu fragen,

leider klappt das mit dem Entfernen der Punkte nicht so gut...

Versucht hab ich ich bis jetzt nur Dinge, wie

Code: Alles auswählen

 StringReplace(version, '.' , '',[rfReplaceAll]); 
.
Allerdings bekomme ich dann Meldungen wie: "2.0.0 is an invalid Integer!"


Ich hoffe ihr könnt mir helfen :).

MfG mark332

PS: Die Punkte sind, damit die Nummer für den Nutzer lesbarer ist.
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Zeichen ('.') aus string entfernen.

Beitrag von theo »

StringReplace sollte schon klappen.
Hast du das auch wie eine Funktion benutzt?

http://www.delphibasics.co.uk/RTL.asp?N ... ingReplace

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: Zeichen ('.') aus string entfernen.

Beitrag von mark332 »

Hmm, komisch...jetzt hab ichs aus dem Auskommentierten Status wiederhergestellt und es geht °-°

Naja, trotzdem Dankeee ;) für deine AW

:D
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Zeichen ('.') aus string entfernen.

Beitrag von gocher »

bedenke: 2.0.4.1 > 2.0.1.11 aber 2041 < 20111
Also ich würde es ungefähr so lösen:

Code: Alles auswählen

 
function NewVersion(const act, compare: String): boolean;
var
  slact, slcompare: TStringList;
  i, i1, i2: integer;
begin
  result := false;
  slact := TStringList.Create; //1. Stringliste erzeugen
  slcompare := TStringList.Create; //2. Stringliste erzeugen
  try
    slact.Delimiter := '.'; //Trennzeichen "." definieren für die 1. Liste
    slact.DelimitedText := act; //aktuellen Versions-String gesplittet durch Trennzeichen einlesen
    slcompare.Delimiter := '.'; //Trennzeichen "." definieren für die 2. Liste
    slcompare.DelimitedText := compare; //zu vergleichenden Versions-String gesplittet durch Trennzeichen einlesen
    i := 0;
    while ((slact.Count>i) or (slcompare.Count>i)) do //so lange Vergleichen bis alle Teil-Strings durch sind 
    begin
      if slact.Count>i then i1 := StrToIntDef(slact[i], 0) else i1 := 0; //Teilstring aus 1.Liste in Zahl konvertieren wenn nicht möglich auf 0 setzten
      if slcompare.Count>i then i2 := StrToIntDef(slcompare[i], 0) else i2 := 0; //Teilstring aus 2.Liste in Zahl konvertieren wenn nicht möglich auf 0 setzten
      result := (i1 < i2); //beide Werte vergleichen und Rückgabewert setzten 
      if (i1<>i2) then break; // Aussteigen wenn der 1. Wert ungleich 2.Wert
      inc(i); //nächste Stelle
    end;
  finally
    slact.Free; //1. Stingliste freigeben
    slcompare.Free; //2. Stringliste freigeben
  end;
end;
Jetzt habe ich es doch lieber getestet, es fehlten noch zwei Klammern und der Ausstieg wenn der 1. Wert größer ist, eigentlich war es auch nur eine so dahingetippe Idee!
Zuletzt geändert von gocher am Sa 8. Jun 2013, 22:05, insgesamt 7-mal geändert.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: Zeichen ('.') aus string entfernen.

Beitrag von mark332 »

gocher hat geschrieben:bedenke: 2.0.4.1 > 2.0.1.11 aber 2041 < 20111

Danke, aber ich hatte nicht vor doppelstellige nummern zu verwenden (außer die erste vllcht), aber wenn man schonmal beim Thema ist... Hat jemand sonst noch andere Ideen, wie man das machen könnte?
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: Zeichen ('.') aus string entfernen.

Beitrag von mark332 »

gocher hat geschrieben:bedenke: 2.0.4.1 > 2.0.1.11 aber 2041 < 20111
Also ich würde es ungefähr so lösen:

Code: Alles auswählen

 
function NewVersion(const act, compare: String): boolean;
var
  slact, slcompare: TStrings;
  i, i1, i2: integer;
begin
  result := false;
  slact := TStringList.Create;
  slcompare := TStringList.Create;
  try
    slact.Delimiter := '.';
    slact.DelimitedText := act;
    slcompare.Delimiter := '.';
    slcompare.DelimitedText := compare;
    i := 0;
    while (slact.Count>i) or (slcompare.Count>i) and not result do
    begin
      if slact.Count>i then i1 := StrToIntDef(slact[i], 0) else i1 := 0;
      if slcompare.Count>i then i2 := StrToIntDef(slcompare[i], 0) else i2 := 0;
      result := (i1 < i2);
      inc(i);
    end;
  finally
    slact.Free;
    slcompare.Free;
  end;
end;
Okeeey, wäre cool wenn du mir jetzt auch noch erklären könntest, was reder einzelne Schritt macht, wäre das richtig cool. Ich hab' nämlich das Bedürfnis, den Code in meinem Programm auch selbst zu verstehen und nicht einfach iwas zu kopieren, von dem ich nichts verstehe ;)

Okay Danke :D jetzt kann ich glaub ich was damit anfangen, ich schau morgen mal nach.

Antworten