Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Kommastellen löschen (https://www.delphipraxis.net/140774-kommastellen-loeschen.html)

UnixX 25. Sep 2009 19:57


Kommastellen löschen
 
Hallo!
Kann mir jemand helfen?
Ich habe folgendes vor.
Ich möchte mehrere Kommastellen aus einer Zeile löschen und zwar die ersten drei.

Ein Beispiel: 6782,237,3489,34576,346539,34566,345,34,534

Daraus soll werden das: 34576,346539,34566,345,34,534

Danke im voraus für eure Hilfe!

Hansa 25. Sep 2009 20:11

Re: Kommastellen löschen
 
for-Schleife über den string (st). Bis 3 zählen (pro komma i := i +1) und bei jedem Komma um eins hochzählen.
Delphi-Quellcode:
for i := 1 to dritteskomma do
  delete (st,1,dritteskomma);

mkinzler 25. Sep 2009 20:12

Re: Kommastellen löschen
 
-Liste Trennen ( StringList.Commatext, Explode)
-ab Index 3 wieder Zusammenfügen

Klaus01 25. Sep 2009 20:14

Re: Kommastellen löschen
 
Guten Abend,

Du möchtest die ersten 3 Zahlen löschen.
mit pos() kannst Du die Kommastellen feststellen
immer eine nach der anderen.
Wenn Du das 3. Komma gefunden hast die Position merken
und dann mit copy() und/oder delete() arbeiten.

Hilfe zu den Kommados findest Du in der Delphi-Hilfe.

Grüße
Klaus

Hansa 25. Sep 2009 20:21

Re: Kommastellen löschen
 
hehe, mkinzler zu überholen ist schon eine Kunst. :mrgreen: Jetzt 5 Min. länger Zeit, deshalb :

machs besser so :

Delphi-Quellcode:
for i := 1 to 3 do
  delete (st,1,pos (',',st));

UnixX 25. Sep 2009 20:49

Re: Kommastellen löschen
 
Geil es funktioniert!!! :bounce2:

Vielen Dank an Hansa!!!

sx2008 25. Sep 2009 21:26

Re: Kommastellen löschen
 
Es gibt da die wunderhübsche Funktion StrToken (aus der JCL):
Delphi-Quellcode:
function StrToken(var S: string; Separator: Char): string;
var
  I: Integer;
begin
  I := Pos(Separator, S);
  if I <> 0 then
  begin
    Result := Copy(S, 1, I - 1);
    Delete(S, 1, I);
  end
  else
  begin
    Result := S;
    S := '';
  end;
end;
Wenn man die dreimal aufruft, hat man das gleiche Ergebnis.
Delphi-Quellcode:
for i := 1 to 3 do StrToken(st, ',');
Das Gute daran ist, dass man StrToken() bei vielen Gelegenheiten gut gebrauchen kann.

Hansa 25. Sep 2009 22:07

Re: Kommastellen löschen
 
Oh je. Wegen StrToken die JCL mitlinken ? Was heisst StrToken überhaupt ? :shock: Für Puristen : man beachte einmal die 16 Zeilen (brutto, also mit Kopf etc.) und meine zwei (nur delete). Reiche das mal besser an die Jedis weiter. :mrgreen:

sx2008 26. Sep 2009 11:25

Re: Kommastellen löschen
 
Zitat:

Zitat von Hansa
Oh je. Wegen StrToken die JCL mitlinken ? Was heisst StrToken überhaupt ? :shock: Für Puristen : man beachte einmal die 16 Zeilen (brutto, also mit Kopf etc.) und meine zwei (nur delete). Reiche das mal besser an die Jedis weiter. :mrgreen:

Es geht doch nicht um Lines of Code sondern um einen Blick über den Tellerrand.
Sollte man StrToken() in einem Programm mehr als einmal einsetzen können, dann hat es sich doch schon gelohnt.
Der Programmcode wird lesbarer und verständlicher.
StrToken liefert pro Aufruf ein Token zurück und verkürzt den Orginalstring um dieses:
Delphi-Quellcode:
s := 'Audi,Mazda,BMW,Opel';
writeln(StrToken(s,',')); // liefert: Audi
writeln(StrToken(s,',')); // liefert: Mazda
Übrigens: Das Linken mit der JCL vergrössert die EXE nur um die Funktionen, die auch benützt werden.

Christian Seehase 26. Sep 2009 13:51

Re: Kommastellen löschen
 
Moin Zusammen,

ich möchte auch noch auf PosEx hinweisen:

Delphi-Quellcode:
var
  sValue : string;
  iPos  : Integer;
  i     : Integer;

begin
  sValue := '6782,237,3489,34576,346539,34566,345,34,534';
  iPos  := Pos(',',sValue);
  for i := 1 to 2 do begin
    iPos := PosEx(',',sValue,iPos+1);
  end;
  sValue := Copy(sValue,iPos+1,MaxInt);
  ShowMessage(sValue);
end;
Sollte Delphi 6 PosEx noch nicht kennen (Unit StrUtils), habe ich hier noch eine abgespeckte Version:

Delphi-Quellcode:
function csPosEx(const AsSeparator : string;const AsValue : string;const AiStart : Integer) : Integer;

var
  iPos : Integer;
  iLen : Integer;

begin
  if AiStart <= 0 then begin
    Result := Pos(AsSeparator,AsValue);
  end else begin
    iPos := AiStart;
    iLen := Length(AsValue);
    while iPos <= iLen do begin
      if AsValue[iPos] = AsSeparator[1] then begin
        Result := iPos;
        Exit;
      end;
      Inc(iPos);
    end;
    Result := 0;
  end;
end;
Abgespeckt meint hier übrigens, dass nur auf ein Zeichen geprüft wird, nicht auf einen Substring, was aber für den gewünschten Anwendungsfall ausreicht.
Bevor noch jemand meckert, dass nicht geprüft wird, ob AsSeparator leer ist: Das macht PosEx auch nicht anders ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:42 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz