Hier kommt die ultimative Funktion um einen String zu inkrementieren.
Dabei wird nicht auf Integer umgewandelt, sondern es wird alles nur durch reine Stringverarbeitung erledigt.
Das hat folgende Vorteile:
* kein Integer Überlauf möglich
* über eine Maske kann genau gesteuert werden, welche Positionen erhöht werden dürfen
Delphi-Quellcode:
{**************************************************************************
* NAME: IncrementWithMask
* DESC: erhöht eine Nummer (die als String vorliegt) um Eins
* Dabei darf "Number" an bestimmten Stellen auch Buchstaben enthalten
* "Mask" bestimmt, an welchen Positionen Ziffern oder Buchstaben erlaubt sind
* Mask: 0 = Ziffern (0..9)
* A = Buchstaben (A..Z)
* Z = Ziffern & Buchstaben
* H = Hex-Ziffern (0..9, A..F)
* = diese Stelle bleibt
* PARAMS: [-]
* RESULT: die erhöhte Nummer
*************************************************************************}
function IncrementWithMask(
const Number, Mask:
string):
string;
function IncrementDigit(x:PChar; m:Char):Boolean;
begin
Result := False;
case m
of
'
0':
begin
x^ := Succ(x^);
if x^ > '
9'
then
begin
x^ := '
0';
Result := True;
end;
end;
'
A':
begin
x^ := Succ(x^);
if x^ > '
Z'
then
begin
x^ := '
A';
Result := True;
end;
end;
'
Z':
begin
if x^ = '
9'
then
x^ := '
A'
else if x^ = '
Z'
then
begin
x^ := '
0';
Result := True;
end
else
x^ := Succ(x^);
end;
'
H':
begin
if x^ = '
9'
then
x^ := '
A'
else if x^ = '
F'
then
begin
x^ := '
0';
Result := True;
end
else
x^ := Succ(x^);
end;
'
':
Result := True;
else
raise Exception.CreateFmt('
IncrementWithMask(%s, %s) - invalid Mask', [Number, Mask]);
end;
end;
var
i : Integer;
begin
Result := Number;
for i := Length(Result)
downto 1
do
begin
if not IncrementDigit(@result[i], Mask[i])
then
Break;
end;
end;
// Aufruf
neueNummer := IncrementWithMask(alteNummer, '
00000000');