Skip to content

Instantly share code, notes, and snippets.

@ytkhs
Last active September 12, 2015 03:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ytkhs/beb2998e1b8a2efb25a5 to your computer and use it in GitHub Desktop.
Save ytkhs/beb2998e1b8a2efb25a5 to your computer and use it in GitHub Desktop.
マイナンバーのチェックデジットを計算する ref: http://qiita.com/qube81/items/fa6ef94d3c8615b0ce64
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
p validate_my_number(123456789010) #=> false
p validate_my_number(123456789011) #=> false
p validate_my_number(123456789012) #=> false
p validate_my_number(123456789013) #=> false
p validate_my_number(123456789014) #=> false
p validate_my_number(123456789015) #=> false
p validate_my_number(123456789016) #=> false
p validate_my_number(123456789017) #=> false
p validate_my_number(123456789018) #=> true
p validate_my_number(123456789019) #=> false
p validate_my_number("023456789013") #=> true (先頭が0の場合)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment