统一社会信用代码的校验(python / delphi)
Python
class SocialCreditCode():
def checkSocialCode(self, socialCode):
'''
:param socialCode:
:return: 校验是否正确
'''
if len(socialCode) == 18:
realCheckNum = socialCode[17]
checkNum = self.unioncode_checknum(socialCode[0:17])
if checkNum == realCheckNum:
return '校验通过'
else:
return '校验未通过'
else:
return '校验未通过,长度不为18位'
def unioncode_checknum(self, code):
"""
:param code:
:return:校验位
"""
weights = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28]
CODE_DICT = {
'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15, 'G': 16, 'H': 17, 'J': 18, 'K': 19, 'L': 20, 'M': 21,
'N': 22, 'P': 23, 'Q': 24,
'R': 25, 'T': 26, 'U': 27, 'W': 28, 'X': 29, 'Y': 30}
total = 0
for i in range(len(code)):
ci = code[i]
if ci in ['I', 'O', 'Z', 'S' 'V']:
return
total += CODE_DICT[ci] * weights[i]
pos = 31 - (total % 31)
if pos == 31:
pos =0
for k, v in CODE_DICT.items():
if v == pos:
return k
if __name__ == '__main__':
social = '91210300YA050574XL'
SOCIAL = SocialCreditCode()
check = SOCIAL.checkSocialCode(social)
print(check)
Delphi
function CheckCode(OrganizationCode: string): Boolean;
const
dic = '0123456789ABCDEFGHJKLMNPQRTUWXY';
weights: array[1..17] of Integer = (1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28);
var
i, total: Integer;
chr: string;
begin
total := 0;
if Length(OrganizationCode) <> 18 then
Result := False
else begin
for i := 1 to 17 do
total := total + (Pos(Copy(OrganizationCode, i, 1), dic) - 1) * weights[i];
i := 31 - total mod 31;
if i = 31 then i := 0;
chr := dic[i+1];
Result := chr = OrganizationCode[18];
end;
end;