统一社会信用代码的校验(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;

posted @ 2024-11-07 13:33  汉学  阅读(25)  评论(0)    收藏  举报