Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   String vorne mit Nullen auffüllen (https://www.delphipraxis.net/211405-string-vorne-mit-nullen-auffuellen.html)

Walter Landwehr 11. Sep 2022 12:26

String vorne mit Nullen auffüllen
 
Hallo ich möchte ein String mit variabler Länge immer bis zur einer bestimmten Länge vorne mit 0 auffüllen. habe dazu folgende Function:
Delphi-Quellcode:
function FillString(AString: String; AChar: Char; ALength: integer): String;
var i:integer;
begin
  FillChar(Result, ALength, Ord(AChar));
  Result := copy(AString, 1, ALength) + copy(Result, ALength - Length(AString), ALength);
end;
aufrufen der Function:
Delphi-Quellcode:
BelegNr := FillString(BelegNr,'0',9);
leider bekomme ich beim Aufruf der function eine Exception. Exception-Klasse $C0000005 mit Meldung 'access violation at 0x0040e4c6: read of address 0x3030302c

was ist da falsch?

TigerLilly 11. Sep 2022 12:56

AW: String vorne mit Nullen auffüllen
 
https://docwiki.embarcadero.com/Libr...Helper.PadLeft

Rolf Frei 11. Sep 2022 13:52

AW: String vorne mit Nullen auffüllen
 
1. Es gibt dafür bereits existierende Funktionen, die das machen.
2. In deinem Code schreibst du in einen nicht allozierten Speicher und erhälst dadurch die AV. Den Result String musst du zuerst entsprechend allozieren, bevor du da ein FillChar machst. Also einfach ein SetLength(Result, ALength) davor einfügen.
3. Mach aus dem ersten Parameter eine Const Parameter. Das solltest du für allen String Parameter machen, die du in der Funktinon nicht veränderst. Ohne const wird der String bei jedem Aufruf der Funktion kopiert, während er bei einem const als Pointer übergeben wird und die Zeit für das Kopierren gespart wird.
Delphi-Quellcode:
function FillString(const AString: String; AChar: Char; ALength: integer): String;
var i:integer;
begin
  SetLength(Result, ALength);
  FillChar(Result, ALength, Ord(AChar));
  Result := copy(AString, 1, ALength) + copy(Result, ALength - Length(AString), ALength);
end;

Walter Landwehr 11. Sep 2022 14:26

AW: String vorne mit Nullen auffüllen
 
Hallo Rolf,

habe die Function geändert aber die Exception kommt immer noch.

mytbo 11. Sep 2022 15:02

AW: String vorne mit Nullen auffüllen
 
Wenn es keine fertige Funktion gibt, dann:
Delphi-Quellcode:
function FillStringLeft(const pmcSource: String; pmChar: Char; pmStrLen: Integer): String;
begin
  if Length(pmcSource) >= pmStrLen then
    Result := pmcSource
  else
    Result := Result.Create(pmChar, pmStrLen - Length(pmcSource)) + pmcSource;
end;

var
  sBelegNr: String;
begin
  sBelegNr := '12345';
  ShowMessage(FillStringLeft(sBelegNr, '0', 9));
Bis bald...
Thomas

Uwe Raabe 11. Sep 2022 15:16

AW: String vorne mit Nullen auffüllen
 
Zitat:

Zitat von Walter Landwehr (Beitrag 1511597)
Delphi-Quellcode:
  FillChar(Result, ALength, Ord(AChar));

Obwohl es FillChar heißt, werden da nicht Char gefüllt sondern Byte. Da Char heutzutage 2 Byte groß sind, füllt der Aufruf nur die erste Hälfte - und das auch noch ab der falschen Stelle (0 statt 1 -> Bang!). Bei Nullen könnte das sogar noch klappen, aber bei echten Unicode-Zeichen würde auch das Ord(AChar) nur das untere Byte berücksichtigen. Fazit: FillChar für Strings ist blöd.

KodeZwerg 11. Sep 2022 15:39

AW: String vorne mit Nullen auffüllen
 
oder total oldschool:
Delphi-Quellcode:
function FillString(AString: String; AChar: Char; ALength: integer): String;
var i:integer;
  s: string;
begin
  if Length(AString) > ALength then
    Exit(AString);
  s := '';
  for i := 0 to Pred(ALength - Length(AString)) do
    s := s + AChar;
  Result := s + AString;
end;

DieDolly 11. Sep 2022 15:42

AW: String vorne mit Nullen auffüllen
 
Weiß nicht mehr woher ich das habe, aber hier ein Einzeiler
Delphi-Quellcode:
function AddLeadingZeroes(const aNumber, aFinalLength: Integer): string;
begin
 Result := System.SysUtils.Format('%.*d', [aFinalLength, aNumber]);
end;

himitsu 11. Sep 2022 15:44

AW: String vorne mit Nullen auffüllen
 
Ja, hier ist nicht das Delphi-Char gemeint, sondern das Char der C-Welt und dort heißt es "Byte".
Bissl verwirrend.

Früher hatte ich für sowas Delphi-Referenz durchsuchenStringOfChar benutzt, um die gewünschte Anzahl an zeichen zu bekommen.
Wobei, wenn BelegNr eine "Nummer" ist, dann einfach dem Delphi-Referenz durchsuchenFormat sagen, dass es füllen soll. :stupid:

[edit]
@DieDolly: jupp.
[/edit]


Delphi-Quellcode:
  S := S.PadLeft(10, '0');

  S := StringOfChar('0', 10 - Length(S)) + S;
  S := string.Create('0', 10 - S.Length) + S;

  // es geht auch andersrum, aber sowas will niemand machen
  S := Copy('0000000000', 1, 10 - Length(S)) + S;
  S := Copy('0000000000', Length(S) + 1) + S;

Walter Landwehr 11. Sep 2022 16:24

AW: String vorne mit Nullen auffüllen
 
Danke an alle jetzt funktioniert es.

Function von mytbo habe ich jetzt benutzt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 Uhr.
Seite 1 von 3  1 23      

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