AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

String vorne mit Nullen auffüllen

Ein Thema von Walter Landwehr · begonnen am 11. Sep 2022 · letzter Beitrag vom 12. Sep 2022
Antwort Antwort
Seite 1 von 3  1 23      
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
384 Beiträge
 
Delphi 10.4 Sydney
 
#1

String vorne mit Nullen auffüllen

  Alt 11. Sep 2022, 12:26
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:
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?
Walter Landwehr
Mfg

Walter
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.174 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: String vorne mit Nullen auffüllen

  Alt 11. Sep 2022, 12:56
https://docwiki.embarcadero.com/Libr...Helper.PadLeft
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
629 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: String vorne mit Nullen auffüllen

  Alt 11. Sep 2022, 13:52
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;

Geändert von Rolf Frei (11. Sep 2022 um 14:01 Uhr)
  Mit Zitat antworten Zitat
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: String vorne mit Nullen auffüllen

  Alt 11. Sep 2022, 14:26
Hallo Rolf,

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

Walter
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
461 Beiträge
 
#5

AW: String vorne mit Nullen auffüllen

  Alt 11. Sep 2022, 15:02
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.008 Beiträge
 
Delphi 12 Athens
 
#6

AW: String vorne mit Nullen auffüllen

  Alt 11. Sep 2022, 15:16
  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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: String vorne mit Nullen auffüllen

  Alt 11. Sep 2022, 15:39
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;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#8

AW: String vorne mit Nullen auffüllen

  Alt 11. Sep 2022, 15:42
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.137 Beiträge
 
Delphi 12 Athens
 
#9

AW: String vorne mit Nullen auffüllen

  Alt 11. Sep 2022, 15:44
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.

[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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (11. Sep 2022 um 15:48 Uhr)
  Mit Zitat antworten Zitat
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
384 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: String vorne mit Nullen auffüllen

  Alt 11. Sep 2022, 16:24
Danke an alle jetzt funktioniert es.

Function von mytbo habe ich jetzt benutzt.
Walter Landwehr
Mfg

Walter

Geändert von Walter Landwehr (11. Sep 2022 um 16:37 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 Uhr.
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