pip install可能なPythonでマイナンバーを検証するモジュールです。ruby版と1万件のクロスチェックを行っています。マイナンバーのチェックデジットを計算するの記事が素晴らしかったので参考にしてPython版を作ることが出来ました。
install
install
pip install mynumber
sample code
install
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
from mynumber import MyNumber
# マイナンバー検証
my_number = 123456789018
print MyNumber.validate(my_number)
# もっとマイナンバー検証
for my_number in MyNumber.gets(1000):
assert MyNumber.validate(my_number)
# もっともっとマイナンバー検証 by iterator:重複あり
for my_number in MyNumber():
assert MyNumber.validate(my_number)
根拠となる法令
第五条令第八条の総務省令で定める算式は、次に掲げる算式とする。
算式
$11 - \Bigl( \displaystyle\sum_{n=1}^{11} P_n \times Q_n \Bigr) \% 11$
ただし、 $\Bigl( \displaystyle\sum_{n=1}^{11} P_n \times Q_n \Bigr) \% 11 ≦1 $の場合は、$0$とする
算式の符号
$Pn$ : 個人番号を構成する検査用数字以外の十一桁の番号の最下位の桁を $1$ 桁目としたときの $n$ 桁目の数字
$Qn$ : $1≦n≦6$ のとき $n+1$、 $7≦n≦11$ のとき $n-5$
原文とマイナンバーのチェックデジットを計算するの記事の数式を引用させて頂きました。
他言語版のご紹介
Ruby版で検証
マイナンバーのチェックデジットを計算するの記事のコードでクロスチェックしてみました。
ruby_mynumber_validate.rb
#!/usr/bin/env ruby
def validate_my_number(mynumber)
# 整数列化
digits = mynumber.to_s.chars.map(&:to_i)
# 12桁しか認めない
return false unless digits.length == 12
# チェックデジットを分離します
check_digit = digits.pop
# 残った数字を小さい方から調べます
digits.reverse!
# 数列の和を11で割った余りを計算します
remainder = (1..11).inject(0) {|sum, i|
p = digits[i-1]
q = (i <= 6) ? i+1 : i-5
sum + p*q
} % 11
case remainder
when 0,1
check_digit === 0
else
check_digit === (11 - remainder)
end
end
my_numbers = [
xxxxx,
xxxxx,
xxxxx,
xxxxx,
]
my_numbers.each do |num|
r = validate_my_number(num)
if r == false then
p num
end
end