Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - String-Behandlung; Führende Nullen


TheHuette - Mi 03.11.04 13:50
Titel: String-Behandlung; Führende Nullen
Hi!
Habe folgendes, kleines Problem:
Ich möchte einen String mit führenden Nullen (z.B. '0001') in einen Integer-Wert umwandeln und dann damit rechnen (z.B. um 1 erhöhen), ohne dass die Nullen "verloren" gehen. Es soll aber keine feste Anzahl an Stellen/Nullen geben. D.h. wenn ich 001 reinbekomme und diesen String um 1 erhöhe, möchte ich 002 rausgeben. Bei 009 möchte ich aber 010 rausgeben und bei 9 die 10.
Jemand einen Tip, wie ich das anstellen kann?

Edit: Wenn ich mein Problem mittlerweile richtig überschaut habe, bräuchte ich also eine StrToInt-Funktion, die die führenden Nullen nicht abschneidet.


jasocul - Mi 03.11.04 13:57

Da wirst du dir wohl eine Funktion schreiben müssen, die dir das aufbereitet. Eine automatische Funktion kenne ich nicht.


jasocul - Mi 03.11.04 14:03

Beispiel dazu:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
function StrFillZero(Zahl: Integer; Laenge : Byte): String;
begin
  result := IntToStr(Zahl);
  while length(result) < Laenge do begin
    result := '0' + result;
  end;
end;


Achtung, es sind noch keine Sicherheitsprüfungen drin. Auch wird nicht geprüft, was passiert, wenn die Zahl länger ist als die vorgegebene Länge.
Man kann natürlich in so eine Funktion auch noch das Hochzählen mit einbauen.


Delete - Mi 03.11.04 14:19

Wie wäre es mit FormatStrings aus der Delphi Hilfe?


jaenicke - Mi 03.11.04 14:51

@Luckie und jasocul: Eure Beiträge beantworten nicht direkt das Problem, es geht ja darum wieder dieselbe Anzahl zu bekommen, ich glaube nicht, das es das Problem ist, wieder Nullen anzufügen.
@TheHuette: Oder?

Zur Lösung: Wenn du einen Integer-Wert hast, mit dem du rechnest ist es nicht möglich, in diesem auch die Anzahl der Nullen zu speichern. Heißt: So etwas wie eine StrToInt-Funktion mit Nullen kann es nicht geben.

Du musst also zuerst die Anzahl der Nullen feststellen, dann mit StrToInt und StrFillZero (von jasocul) arbeiten, und schließlich nach den eben geposteten Möglichkeiten die Nullen wiederherstellen!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function getZeroCount(Eingabe: String): Byte;
begin
    Result:=0;
    while (Eingabe[1]='0'do begin
        Inc(Result);
        Delete(Eingabe,1,1);
    end;
end;

var ZeroCount: Byte;
    Zahl: Integer;
begin
    ZeroCount:=getZeroCount(Dein_String);
    Zahl:=StrToInt(Dein_String);
    //(...)
    Neuer_String:=StrFillZero(Zahl,ZeroCount):
end;


Hoffe ist richtig...


jasocul - Mi 03.11.04 15:14

Funktioniert spätestens dann nicht mehr, wenn die Zahl an sich länger wird. Also z.B. 99 -> 100 u.s.w.
Man könnte dann zwar anfangen, dies zu prüfen, aber das ist dann vielleicht doch ein bisschen viel Aufwand.


jaenicke - Mi 03.11.04 15:19

jasocul hat folgendes geschrieben:
Funktioniert spätestens dann nicht mehr, wenn die Zahl an sich länger wird. Also z.B. 99 -> 100 u.s.w.

Stimmt, hatte ich vergessen, ist aber einfach zu beheben:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var ZeroCount: Byte;  
    Zahl: Integer;  
begin  
    ZeroCount:=getZeroCount(Dein_String);  
    Zahl:=StrToInt(Dein_String);  
    //(...)  
    Neuer_String:=StrFillZero(Zahl,ZeroCount
        +Length(IntToStr(StrToInt(Dein_String)))-Length(Zahl)):  
end;


jasocul - Mi 03.11.04 15:44

Na ja, Geschmackssache.
Die Länge soll vorher und hinterher die selbe sein. Da würde es genügen, sich einfach die Länge des Strings zu merken. :wink:


TheHuette - Mi 03.11.04 17:42

Hi!
Habe es mit dem Vergleich Length(eingehender String) > Length(ResultString) realisiert.
Dem ResultString werden dann so viele Nullen "vorgehängt" bis beide gleich lang sind (For...).

Das 0099 -> 0100 Problem hat sich dadurch irgendwie erübrigt. Kommt immer das raus, was ich haben will.

Danke für eure Hilfe.


MfG
Hütte


BenBE - Mi 03.11.04 19:57

Eigentlich sollte das mit folgendem Befehl funktioneren:


Delphi-Quelltext
1:
ZahlmitNullen := Format('%.*d', [BreiteDerZahl, EigentlicheZahl]);                    


Für eine Erklärung siehe DOH bzgl. Format-Strings.


Motzi - Mi 03.11.04 21:54

BenBE hat folgendes geschrieben:
Eigentlich sollte das mit folgendem Befehl funktioneren:


Delphi-Quelltext
1:
ZahlmitNullen := Format('%.*d', [BreiteDerZahl, EigentlicheZahl]);                    

Ja, bzw kann man das gleich direkt aufs die Fragestellung umlegen:

Delphi-Quelltext
1:
2:
3:
4:
function IncWithLeadingZeros(const s: String): String;
begin
  Result := Format('%.*d', [Length(s), StrToInt(s)]);
end;

Ungetestet, sollte aber IMHO funktionieren..


BenBE - Mi 03.11.04 22:08

Habsch zu spät gesehen und Editieren ging ja nicht, genausowenig, wie 2 Posts vom gleichen Author hintereinander schön aussehen. Allerdings müsste man noch erwähnen, dass er seine Operationen mit dem Teil "StrToInt" ausführen muss, so dass der Ausdruck einen Integer liefert. Wenn ein Float rauskommt, dann meckert der Compiler zwar nicht, aber Format bringt ne Exception wegen ungültigem Typ.


jasocul - Do 04.11.04 09:06

Hatte in der OH auch schon gesucht, bevor ich meine Funktion vorgeschlagen hatte. Habe dort aber keinen Hinweis auf die führenden Nullen für die Formatierung gefunden. :oops: