Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   führende null entfernen (https://www.delphipraxis.net/197358-fuehrende-null-entfernen.html)

p80286 1. Aug 2018 18:20

AW: führende null entfernen
 
@Redeemer

Dafür müßtest Du das erste nicht 0 suchen, und dann kannst Du es am Stück löschen.

Delphi-Quellcode:
i:=0;
if length(mystring)>0 then begin
  repeat
    if mystring[i+1]<>'0' then inc (i,1);
  until (mystring[i+1]<>'0') or (i>=length(mystring));
  if i>0 then delete(mystring,1,i);
end;
Gruß
K-H

@KodeZwerg
Dein zweites Beispiel kann Ärger machen, da Du die Länge des String nicht berücksichtigst.

Redeemer 1. Aug 2018 18:30

AW: führende null entfernen
 
Zitat:

Zitat von Neutral General (Beitrag 1409401)
Zitat:

Zitat von Redeemer (Beitrag 1409399)
for-Schleifen, die etwas löschen (wodurch die Nachfolger aufrücken), einfach immer mit downto machen. Klappt übrigens auch nicht mit for-in-Schleifen.

"Einfach downto" ist in dem Fall aber leider nicht so einfach, weil er nur die '0'en am Anfang des Strings entfernen will und mit ner downto-Schleife ist es etwas problematisch festzustellen ob weiter vorne (nur) noch '0'en sind oder ob dazwischen jetzt noch ne andere Zahl kommt und man daher die aktuelle '0' nicht löschen darf.

Ach ja, stimmt.

KodeZwerg 1. Aug 2018 19:05

AW: führende null entfernen
 
Zitat:

Zitat von p80286 (Beitrag 1409403)
Dein zweites Beispiel kann Ärger machen, da Du die Länge des String nicht berücksichtigst.

Ich versuche gerade Nachzuvollziehen an welcher Stelle es böse ausgehen könnte, deswegen kommentare rangeklebt damit ihr seht was ich anstellen wollte, vielleicht ist umsetzung falsch
Delphi-Quellcode:
function RemDelLeadChar(const Input: string; const LeadChar: Char): string;
var
  i: Integer;
begin
  i := 1; // String Index auf 1 (der erste) setzen
  Result := Input; // result mit input initialisieren
  if ((Length(Input) > 0) and (Input[1] = LeadChar)) then // wenn länge +1 und mit LeadChar anfängt dann...
  begin // block anfangen damit delete korrekt ausgeführt wird
   while (Input[i] = LeadChar) do inc(i); // solange leadchar vorne [i] vorkommt gib +1 auf i
   Delete(Result, 1, i-1); // da wenigstens ein LeadChar vorkam kann man bedenkenlos ausführen
  end; // ende vom länge/leadchar block
  if Result = '' then Result := LeadChar; // falls string leer ist, gib wenigstens ein leadchar wieder
end;

Hobbycoder 1. Aug 2018 19:12

AW: führende null entfernen
 
Ein hätte ich auch noch:
Delphi-Quellcode:
function RemoveLeftZero(input: string): string;
var
  i: integer;
begin
  result:='';
  for i:=1 to length(input) do
    if result<>'' then
      result:=result+input[i]
    else
      if input[i]<>'0' then result:=result+input[i];
end;
Performance ist aber sicher nicht die beste, aber darum geht's hier ja nicht.

Hobbycoder 1. Aug 2018 19:18

AW: führende null entfernen
 
Und noch einen:
Delphi-Quellcode:
function RemoveLeftZero(input: string): string;
var
  i: integer;
begin
  result:=input;
  for i:=1 to length(input) do
    if input[i]='0' then
      delete(result, 1, 1) else
      Break;
end;
Schleife muss halt bei '0805668' nur zweimal durchlaufen.

Neutral General 1. Aug 2018 19:35

AW: führende null entfernen
 
KodeZwerg das Problem ist diese Zeile:
Delphi-Quellcode:
while (Input[i] = LeadChar) do inc(i);


Das kann bei einem String der komplett aus LeadChars besteht in die Hose gehen, weil zumindest mal Input[Length(Input)+1] gecheckt wird, was mit ein bisschen Pech knallen kann.
Deswegen müsste es
Delphi-Quellcode:
while (i <= Length(Input)) and (Input[i] = LeadChar) do inc(i);

heißen

KodeZwerg 1. Aug 2018 19:41

AW: führende null entfernen
 
Zitat:

Zitat von Neutral General (Beitrag 1409417)
Deswegen müsste es
Delphi-Quellcode:
while (i <= Length(Input)) and (Input[i] = LeadChar) do inc(i);

:thumb::thumb: Danke fürs Nase drauf stubsen!

Ps: Bei meinen Samples könnte man die schleifen auch ab zweite position laufen lassen um einen doppelten check zu vermeiden aber da fehlt dann erst mal ein längen check ob überhaupt content eine länge von 2 besitzt. Ich wollte halt string operationen auf einen einzigen manipulator bringen, jeweils basierend auf einem count index-wert.

KodeZwerg 1. Aug 2018 20:07

AW: führende null entfernen
 
Zitat:

Zitat von p80286 (Beitrag 1409403)
Delphi-Quellcode:
i:=0;
if length(mystring)>0 then begin
  repeat
    if mystring[i+1]<>'0' then inc (i,1);
  until (mystring[i+1]<>'0') or (i>=length(mystring));
  if i>0 then delete(mystring,1,i);
end;

Das führt bei mir zu einer Endlos-Schleife, aber so klappts:
Delphi-Quellcode:
function DelLeadChar(const Input: string; const LeadChar: Char): string;
var
  i: Integer;
begin
  i:=0;
  Result := Input;
  if length(Input)>0 then
   begin
     repeat
       if Input[i+1]=LeadChar then inc (i,1);
//       if Input[i+1]<>LeadChar then inc (i,1); // nicht gut ^_^
     until (Input[i+1]<>LeadChar) or (i>=length(Input));
     if i>0 then delete(Result,1,i);
   end;
end;

DeddyH 1. Aug 2018 20:10

AW: führende null entfernen
 
Ich hätte mittels Schleife den Index des ersten Nicht-Null-Zeichens ermittelt und ab da einfach kopiert.

p80286 1. Aug 2018 20:10

AW: führende null entfernen
 
:oops:
Typischer Fall von das eine Denken und das Andere tippen!

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:35 Uhr.
Seite 3 von 5     123 45      

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