Hallo Gehstock,
wenn du deinen Code fertig hast, dann kannst du mal vergleichen. Mehr als ein Dutzend Zeilen sind nicht nötig.
EDIT: drei Fehler habe ich in meinem Code entdeckt.
(1) Die Gewichte müssen in absteigender Folge angewandt werden.
(2) Jeder Abschnitt muss wieder mit dem höchsten Gewicht starten.
(3) Die Prüfziffern der Abschnitte tragen das Gewicht 1.
Delphi-Quellcode:
function ValidIdCardNumber(const s: string): Boolean;
var
i, iPos, iSum, iWeight: Integer;
begin
Result := Length(s) = 36;
if not Result then Exit;
iSum := 0;
iPos := 2;
for i := 1 to 35 do
if s[i] in ['0'..'9'] then
begin
if i in [10, 20, 28]
then iWeight := 1
else iWeight := Pred(2 shl iPos);
Inc(iSum, (Ord(s[i]) - Ord('0')) * iWeight);
iPos := Pred(iPos + 3) mod 3;
end else iPos := 2;
Result := iSum mod 10 = Ord(s[36]) - Ord('0');
end;
Grüße vom marabu