日本のマイナンバーは、中国の公民番号と違って、出生地や誕生日、性別などに全く紐づいていないようだ。番号からは何もわからないが、人のチェックがやりにくいので運用上の間違えも多そう。
ただし、チェックデジット(下一桁の部分)はある。
たとえば、11111111111なら最後が8になり、111111111118がマイナンバー。
チェックデジットについて総務省が決めた定義
11-(を11で除した余り)。
ただしを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;