Registriert seit: 2. Mär 2004
5.508 Beiträge
Delphi 5 Professional
|
AW: string inkrementieren
3. Jun 2011, 13:42
Hast Du es noch etwas ultimativer irgendwo
Gibt es eigentlich eine Steigerung zu "ultimativer" ?
Delphi-Quellcode:
function FastCharPos(const S: AnsiString; const C: AnsiChar): Integer;
begin
for Result := 1 to Length(S) do
if S[Result] = C then
Exit;
Result := 0;
end;
function IncSingleDigit(var c:AnsiChar; n : Integer; const d:string):Integer;
var
z : Integer;
len : Integer;
begin
len := length(d);
z := FastCharPos(d, c) - 1;
if z < 0 then z := 0;
z := z + n;
c := d[(z mod len) +1];
Result := z div len;
end;
function IncBinary(var x:Byte; n : Integer):Integer;
var
z : Integer;
begin
z := Ord(x) + n;
x := z and $FF;
Result := z div 256;
end;
{**************************************************************************
* NAME: IncrementWithMask
* DESC: erhöht eine Nummer (die als String vorliegt) um den Wert N
* Dabei darf "Number" an bestimmten Stellen auch Buchstaben enthalten
* "Mask" bestimmt, an welchen Positionen Ziffern oder Buchstaben erlaubt sind
* Mask: 0 = Ziffern (0..9)
* 2 = Binär (0..1)
* A = Buchstaben (A..Z)
* a = Buchstaben (a..z)
* Z = Ziffern & Gross-Buchstaben
* z = Ziffern & Klein-Buchstaben
* H = Hex-Ziffern (0..9, A..F)
* h = Hex-Ziffern (0..9, a..f)
* B = Zeichen wird binär erhöht
* = diese Stelle bleibt
* PARAMS: [-]
* RESULT: die erhöhte Nummer
* CHANGED: 03-06-2011/shmia
*************************************************************************}
function IncrementWithMask(const Number, Mask:AnsiString; N : Integer):AnsiString;
function IncrementDigit(x:PAnsiChar; m:Char; n:Integer):Integer;
const
digits : AnsiString = '0123456789';
alpha : AnsiString = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
hex : AnsiString = '0123456789ABCDEF';
numalpha : AnsiString = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
begin
case m of
'0': Result := IncSingleDigit(x^, n, digits);
'2': Result := IncSingleDigit(x^, n, '01');
'A': Result := IncSingleDigit(x^, n, alpha);
'a': Result := IncSingleDigit(x^, n, LowerCase(alpha));
'Z': Result := IncSingleDigit(x^, n, numalpha);
'z': Result := IncSingleDigit(x^, n, LowerCase(numalpha));
'H': Result := IncSingleDigit(x^, n, hex);
'h': Result := IncSingleDigit(x^, n, LowerCase(hex));
'B': Result := IncBinary(PByte(x)^,n);
' ':
Result := n;
else
begin
Result := n;
x^ := m;
end
end;
end;
var
i : Integer;
begin
Result := Number;
UniqueString(Result);
for i := Length(Result) downto 1 do
begin
N := IncrementDigit(@result[i], Mask[i], N);
if N = 0 then
Break;
end;
end;
PS: Ohhjee, jetzt haben wir 2 Implementierungen
Andreas
Geändert von shmia ( 3. Jun 2011 um 14:04 Uhr)
|
|
Zitat
|