Es geht auch ohne Rekursion. Man muss sich nur überlegen, was passiert,
wenn zu einer "Zahl" der Wert 1 addiert wird.
Es kann an jeder Stelle einen
Übertrag geben.
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;
var
c : Char;
begin
Result := False;
case m
of
'
0':
begin
c := Succ(x^);
if c > '
9'
then
begin
c := '
0';
Result := True;
end;
x^ := c;
end;
'
A':
begin
c := Succ(x^);
if c > '
Z'
then
begin
c := '
A';
Result := True;
end;
x^ := c;
end;
'
Z':
begin
c := x^;
if c = '
9'
then
c := '
A'
else if c = '
Z'
then
begin
c := '
0';
Result := True;
end
else
c := Succ(c);
x^ := c;
end;
'
H':
begin
c := x^;
if c = '
9'
then
c := '
A'
else if c = '
F'
then
begin
c := '
0';
Result := True;
end
else
c := Succ(c);
x^ := c;
end;
'
':
;
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;
Beispiel:
Delphi-Quellcode:
var
s, m : string;
begin
s:= '0008899';
m:= '0000000';
s := IncrementWithMask(s, m); // s enthält nun '0008900'