2017年12月22日 星期五

a020-身份證檢驗

a020-身份證檢驗


我國的身分證字號有底下這樣的規則,因此對於任意輸入的身分證字號可以有一些基本的判斷原則,請您來判斷一個身分證字號是否是正常的號碼(不代表確有此號、此人)。
(1) 英文代號以下表轉換成數字

      A=10 台北市     J=18 新竹縣     S=26 高雄縣
      B=11 台中市     K=19 苗栗縣     T=27 屏東縣
      C=12 基隆市     L=20 台中縣     U=28 花蓮縣
      D=13 台南市     M=21 南投縣     V=29 台東縣
      E=14 高雄市     N=22 彰化縣     W=32 金門縣
      F=15 台北縣     O=35 新竹市     X=30 澎湖縣
      G=16 宜蘭縣     P=23 雲林縣     Y=31 陽明山
      H=17 桃園縣     Q=24 嘉義縣     Z=33 連江縣
      I=34 嘉義市     R=25 台南縣

  (2) 英文轉成的數字, 個位數乘9再加上十位數的數字

  (3) 各數字從右到左依次乘1、2、3、4....8

  (4) 求出(2),(3) 及最後一碼的和
  (5) (4)除10 若整除,則為 real,否則為 fake
 例: T112663836
2 + 7*9 + 1*8 + 1*7 + 2*6 + 6*5 + 6*4 + 3*3 + 8*2 + 3*1 + 6 = 180
除以 10 整除,因此為 real 

'''
1. 請求輸入後,將首字轉為大寫字母(方便第四個步驟處理)
2. 利用regular expression做簡易判斷,若不符合規則,那就不用繼續做下去了
3. 公式是固定的,可以先建表,如 C 12 => ((12/10)+(12%10)*9)%10 = 9
                                Z 33 => ((33/10)+(33%10)*9)%10 = 0
                                [ABCDEFGHIJKLMNOPQRSTUVWXYZ]
                                [10987654932210898765431320]
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                先把 A-Z 對應數值查表套入公式計算所得
4. 先處理(首字轉換、檢查碼)
5. 再處理(剩餘數值)
6. 判斷是否整除
PPT https://www.ptt.cc/bbs/Python/M.1324461940.A.A19.html
'''


import re
i = str(input('請輸入身份證產生器 > '))
i = i.capitalize()

#capitalize()将字符串的第一个字母变成大写,其他字母变小写。
#print(i)

if not re.match('^[A-Z][12][0-9]{8}$', i):
    print ('pattern not valid')
    exit()
    
a = []; a.extend("10987654932210898765431320")
c = int(a[ord(i[0])-65]) + int(i[9])
for x in range(1, 9):
    c += int(i[x]) * (9 - x)

if c % 10 != 0:
    print ('rule check failed')
    exit()
    
print ('pass')


====================== RESTART: F:/Python_APSC/a020.py ======================
請輸入身份證產生器 > A178365519
pass
>>> 
====================== RESTART: F:/Python_APSC/a020.py ======================
請輸入身份證產生器 > A178365518
rule check failed
>>> 

沒有留言:

張貼留言

Messaging API作為替代方案

  LINE超好用功能要沒了!LINE Notify明年3月底終止服務,有什麼替代方案? LINE Notify將於2025年3月31日結束服務,官方建議改用Messaging API作為替代方案。 //CHANNEL_ACCESS_TOKEN = 'Messaging ...