マイナンバーのチェックデジット計算プログラム

日本のマイナンバーは、中国の公民番号と違って、出生地や誕生日、性別などに全く紐づいていないようだ。番号からは何もわからないが、人のチェックがやりにくいので運用上の間違えも多そう。
ただし、チェックデジット(下一桁の部分)はある。
たとえば、11111111111なら最後が8になり、111111111118がマイナンバー。

チェックデジットについて総務省が決めた定義
11-(\sum_{n=1}^{11}Pn\times Qnを11で除した余り)。
ただし\sum_{n=1}^{11}Pn\times Qnを11で除した余り≦1の場合は0とする。

PnとQnについて
Pn:個人番号を構成する検査用数字以外の十一桁の番号の最下位の桁を1桁目としたときのn桁目の数字。
Qn:1≦n≦6のときn+1  7≦n≦11のときn-5。

となっているので、Delphiで適当に書いてみるとこんな感じか。エラー処理とかしてない。

function MyNumberCheck(MyNumber: string): boolean;
var
  S, S2: string;
  T, N, I: integer;

begin
  Result := false;

  S := ReverseString(MyNumber);
  if Length(S) <> 12 then
    Exit;
  S2 := Copy(S, 1, 1);
  S := Copy(S, 2, 11);
  T := 0;
  for I := 1 to 11 do
  begin
    N := Strtoint(S[i]);
    if I < 7 then
      T := T + N * (I + 1)
    else
      T := T + N * (I - 5);
  end;

  T := T mod 11;
  case T of
    0 .. 1:
      T := 0;
  else
    T := 11 - T;
  end;

  if Inttostr(T) = s2 then
    Result := true
  else
    Result := false;
end;