Thema: Delphi string inkrementieren

Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#22

AW: string inkrementieren

  Alt 3. Jun 2011, 12: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 13:04 Uhr)
  Mit Zitat antworten Zitat