![]() |
führende null entfernen
Hallo zusammen,
ich bekomme es leider nicht hin, eine führende Null bzw führende Nullen aus einem String zu entfernen. Ich habe z.B. diese Artikelnummer: 00850046. Diese soll zu 850046 geändert werden.
Code:
Ich dachte, er geht diesen String so lange durch bis er auf keine Null mehr trifft und bricht dann ab.
For i := 1 to Length(nr_pzn_bereinigt) do
begin If nr_pzn_bereinigt[i] = '0' Then Delete(nr_pzn_bereinigt, i, 1) Else Break; Geht leider nicht. Kann jemand helfen? |
AW: führende null entfernen
Ja, macht er wahrscheinlich auch, direkt bei StringElement[0] wo die Länge des Strings drin steht.
|
AW: führende null entfernen
Sofern sichergestellt ist, dass sich im String ausschließlich Ziffern befinden, wäre StrToInt mit einem anschließenden Zurückwandeln mit IntToStr nicht einfacher?
Grüße Dalai |
AW: führende null entfernen
Zitat:
Das Problem ist, dass der String kürzer wird, und die Schleife so quasi "verrutscht" Schleifendurchlauf: i=1: 00850046 => 0850046 i=2: 0850046 Die zweite 0 hat er quasi jetzt schon übersprungen weil sich die 2. 0 jetzt nach dem Löschen der ersten auch an Position 1 befindet aber die Schleife jetzt schon bei i=2 ist. |
AW: führende null entfernen
Zitat:
(Edit: Da war jemand schneller) |
AW: führende null entfernen
Delphi-Quellcode:
geht, solange nur Ziffern vorkommen, kommt mal ein Buchstabe (oder besser einen Nichtziffer) geht's schief.
nr_pzn_bereinigt[i] := IntToStr(StrToInt(nr_pzn_bereinigt[i]));
Delphi-Quellcode:
Beispiel zu Deinem Vorgehen:
while Copy(nr_pzn_bereinigt[i],1,1) = '0' do begin
nr_pzn_bereinigt[i] := Copy(nr_pzn_bereinigt[i],2,Length(nr_pzn_bereinigt[i])); end; i ist 1 00850046 1. Zeichen = '0' 0850046 bleibt dann übrig i wird nun 2 zweites Zeichen ist nun 8, da das erste Zeichen entfernt wurde. 0850046 bleibt dann übrig i wird nun 3 drittest Zeichen = 5 0850046 bleibt dann übrig i wird nun 4 viertes Zeichen = 0 085046 bleibt dann übrig i wird nun 5 fünftes Zeichen = 4 085046 bleibt dann übrig i wird nun 6 fünftes Zeichen = 6 085046 bleibt dann übrig Das ist eher so 'ner Art zufälliges Nullenentfernen, abhängig davon wieviele Nullen vorher dort waren und an welcher Position sie sich befinden. |
AW: führende null entfernen
@Delphi.Narium: Deine Simulation stimmt nicht ganz, weil er bei i=2 mit break rausspringen würde, weil '8' <> '0'
|
AW: führende null entfernen
In Unit JclStrings könnte man
Delphi-Quellcode:
aufrzufen um einen "850046" String zu erhalten, ansonsten schließe ich mich Dalei an, hier ein mini Beispiel dazu:
StrTrimCharLeft('00850046', '0');
Delphi-Quellcode:
function EntferneNullen(const Input: String): String;
begin Result := IntToStr(StrToIntDef(Input,0)); end; |
AW: führende null entfernen
Wenn die Version im Profil stimmt, könnte man das natürlich auch über
Delphi-Quellcode:
lösen
nr_pzn_bereinigt := nr_pzn_bereinigt.TrimLeft(['0']);
|
AW: führende null entfernen
Zitat:
|
AW: führende null entfernen
Zitat:
|
AW: führende null entfernen
Ich habe auch noch etwas herumgespielt, sowas kam dabei raus:
Delphi-Quellcode:
Beispiel Aufruf:
function RemLeadChar(const Input: string; const LeadChar: Char): string;
var i, ii: Integer; begin ii := 0; if Length(Input) > 0 then // ein zeichen minimum um weiter zu kommen if Input[1] = LeadChar then // fängt String nicht mit LeadChar an gibts nichts zu tun for i := 1 to Length(Input) do // komplette stringlänge abarbeiten initialisieren if Input[i] = LeadChar then ii := i else Break; // kommt vorne ein LeadChar vor Position merken if ii > 0 then Result := Copy(Input, ii+1, Length(Input)) // entweder anfang verwerfen else Result := Input; // oder eingabe zurück end;
Delphi-Quellcode:
Memo1.Lines.Add(RemLeadChar(Edit1.Text,'0'));
|
AW: führende null entfernen
Wie wärs einfach hiermit?
Delphi-Quellcode:
function RemLeadChar(const Input: string; const LeadChar: Char): string;
begin if Length(Input) > 0 then begin Result := Input; while (Result[1] = LeadChar) do delete(Result, 1, 1); end else Result := ''; end; |
AW: führende null entfernen
oder
Delphi-Quellcode:
function RemLeadChar(const Input: string; const LeadChar: Char): string;
begin Result := Input; if Length(Result) > 0 then while Result[1] = LeadChar do delete(Result, 1, 1); end; |
AW: führende null entfernen
Btw: Das mehrfache
Delphi-Quellcode:
ist ziemlich imperformant. Ich würde erstmal in einer Schleife die Stelle der ersten nicht-Null suchen und danach per
Delete
Delphi-Quellcode:
alles bis zu diesem Index am Stück entfernen.
Delete
|
AW: führende null entfernen
Zitat:
|
AW: führende null entfernen
Das ist ja das schöne bei Delphi, jeder kann seine persönliche Note einbringen :love:
Müssen viele LeadChars entfernt werden ist mein Vorschlag bestimmt nen takken schneller ^_^ Mini Upgrade vs Leerstrings
Delphi-Quellcode:
und noch ein Vorschlag zu dem While Delete
function RemLeadChar(const Input: string; const LeadChar: Char): string;
var i, ii: Integer; begin ii := 0; if Length(Input) > 0 then // ein zeichen minimum um weiter zu kommen if Input[1] = LeadChar then // fängt String nicht mit LeadChar an gibts nichts zu tun for i := 1 to Length(Input) do // komplette stringlänge abarbeiten initialisieren if Input[i] = LeadChar then ii := i else Break; // kommt vorne ein LeadChar vor Position merken if ii > 0 then Result := Copy(Input, ii+1, Length(Input)) // entweder anfang verwerfen else Result := Input; // oder eingabe zurück if Result = '' then Result := LeadChar; // falls input leer oder nur aus LeadChars bestand, gib wenigstens ein LeadChar zurück end;
Delphi-Quellcode:
function RemDelLeadChar(const Input: string; const LeadChar: Char): string;
var i: Integer; begin i := 1; Result := Input; if ((Length(Input) > 0) and (Input[1] = LeadChar)) then begin while (Input[i] = LeadChar) do inc(i); Delete(Result, 1, i-1); end; if Result = '' then Result := LeadChar; end; |
AW: führende null entfernen
for-Schleifen, die etwas löschen (wodurch die Nachfolger aufrücken), einfach immer mit downto machen. Klappt übrigens auch nicht mit for-in-Schleifen.
|
AW: führende null entfernen
Zitat:
|
AW: führende null entfernen
Kann ich ein Beispiel bekommen wo der genannte Code nicht funktioniert? Ich habe es mit allerlei kram getestet ohne auf Fehler zu stossen. Ein Delete bzw Cut kommt bei mir ja auch nur einmal vor.
|
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:
Gruß
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; K-H @KodeZwerg Dein zweites Beispiel kann Ärger machen, da Du die Länge des String nicht berücksichtigst. |
AW: führende null entfernen
Zitat:
|
AW: führende null entfernen
Zitat:
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; |
AW: führende null entfernen
Ein hätte ich auch noch:
Delphi-Quellcode:
Performance ist aber sicher nicht die beste, aber darum geht's hier ja nicht.
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; |
AW: führende null entfernen
Und noch einen:
Delphi-Quellcode:
Schleife muss halt bei '0805668' nur zweimal durchlaufen.
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; |
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 |
AW: führende null entfernen
Zitat:
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. |
AW: führende null entfernen
Zitat:
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; |
AW: führende null entfernen
Ich hätte mittels Schleife den Index des ersten Nicht-Null-Zeichens ermittelt und ab da einfach kopiert.
|
AW: führende null entfernen
:oops:
Typischer Fall von das eine Denken und das Andere tippen! Gruß K-H |
AW: führende null entfernen
Zitat:
Gruß K-H |
AW: führende null entfernen
Zitat:
|
AW: führende null entfernen
Zitat:
Zitat:
Delphi-Quellcode:
function RemLeadChar(const Input: string; const LeadChar: Char): string;
var i, ii: Integer; begin ii := 0; // if Length(Input) > 0 then // ein zeichen minimum um weiter zu kommen // den check kann man sich sparen // if Input[1] = LeadChar then // fängt String nicht mit LeadChar an gibts nichts zu tun // den check kann man sich sparen for i := 1 to Length(Input) do // komplette stringlänge abarbeiten initialisieren if Input[i] = LeadChar then ii := i else Break; // kommt vorne ein LeadChar vor Position merken if ii > 0 then Result := Copy(Input, ii+1, Length(Input)) // entweder anfang verwerfen else Result := Input; // oder eingabe zurück if Result = '' then Result := LeadChar; // falls input leer oder nur aus LeadChars bestand, gib wenigstens ein LeadChar zurück end; |
AW: führende null entfernen
Auf dem Tablet direkt im Editor getippt, daher komplett aus dem Kopf:
Delphi-Quellcode:
function StrippedLeft(const Input: String; const Leading: Char): String;
var i, idx: integer; begin idx := 0; for i := 1 to Length(Input) do if Input[i] <> Leading then begin idx := i; Break; end; if idx > 0 then Result := Copy(Input, idx) else Result := ´´; end; |
AW: führende null entfernen
Zitat:
|
AW: führende null entfernen
Was spricht eigentlich gg. das offizielle TrimLeft (siehe dem akzeptierten Vorschlag von SProske ) ?
|
AW: führende null entfernen
Gar nichts, aber die nötige Überladung ist ja AFAIK erst mit dem StringHelper eingeführt worden, ältere Delphi-Versionen dürften das noch nicht kennen.
|
AW: führende null entfernen
Da mir nach meinem ersten Kaffee danach war:
Delphi-Quellcode:
Vorteil:
function DelLeadStr(LeadStr : String; InpStr : String) : String;
var vLeadStr : String; begin vLeadStr := LeadStr; while Pos(vLeadStr, InpStr) = 1 do begin vLeadStr := vLeadStr + LeadStr; end; Delete(InpStr, 1, Length(vLeadStr) - Length(LeadStr)); Result := InpStr; end; - Kein Zugriff per Index auf den String --> Damit leicht umstellbar auf WideString (oder kann man da auch über den Index zugreifen?) - Keine Längenprüfung erforderlich - Auch führende Strings (also nicht nur ein Zeichen) können behandelt werden Nachteil: - Vermutlich etwas langsamer |
AW: führende null entfernen
Man kann auch bei WideStrings ganz normal ohne Probleme über den Index zugreifen.
|
AW: führende null entfernen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 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 by Thomas Breitkreuz