求教身份证编码规则

soft8 2003-10-14 09:14:24
有那位大哥知道身份证最后一位的编码规则啊,多谢了。

能给出算法最好。
...全文
65 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanqth 2003-10-14
  • 打赏
  • 举报
回复
身份证校验码产生方法:(我已编程试过十几个身份证号)

∑(ai×Wi)(mod 11)……………………………………(1)

公式(1)中:

i----表示号码字符从由至左包括校验码在内的位置序号;

ai----表示第i位置上的号码字符值;

Wi----示第i位置上的加权因子,其数值依据公司Wi=2(n-1)(mod 11)计算得出。

i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1

根据公式(1)进行计算,然后根据计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10:

∑(ai×WI)(mod 11) 0 1 2 3 4 5 6 7 8 9 10

校验码字符值ai 1 0 X 9 8 7 6 5 4 3 2

function TForm1.f(ID: string):string;

const

W:array [1..18] of integer = (7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1);

A:array [0..10] of char = ('1','0','x','9','8','7','6','5','4','3','2');

var

i, j, S: integer;

NewID: string;

begin

if Length(ID) <> 15 then

result:= ''

else begin

NewID:= ID;

Insert('19', NewID, 7);

S:= 0;

try

for i:=1 to 17 do begin

j:= StrToInt(NewID[i]) * W[i];

S:= S + j;

end;

except

result:= '';

exit;

end;

S:= S mod 11;

Result:= NewID + A[S];

end;

end;

这个简单一点,上面那个全面一点(有取生日、地区、性别),
耙子 2003-10-14
  • 打赏
  • 举报
回复
http://www.csdn.net/develop/article/14/14687.shtm

很早以前我写的。
tanqth 2003-10-14
  • 打赏
  • 举报
回复
procedure TjbqkForm.sflz(ID: string);
const
W: array[1..18] of integer = (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1);
A: array[0..10] of char = ('1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2');
var
NewID: string;
// xb, dq: string;
i, j, S: integer;
begin
case Length(ID) of
0: MessageDlg('该员工无身份证!', mtError, [mbOK], 0);
15: begin
NewID := copy(id, 1, 2);
if DM.ATqy.Locate('编码', NewID, []) then
DBEdit3.Text := trim(DM.ATqy.FieldByName('区域名称').AsString);
NewID := copy(id, 1, 4);
if DM.ATqy.Locate('编码', NewID, []) then
DBEdit3.Text := trim(DBEdit3.Text) + trim(DM.ATqy.FieldByName('区域名称').AsString);
NewID := copy(id, 1, 6);
if DM.ATqy.Locate('编码', NewID, []) then
Dm.AQjbxx.FieldByName('籍贯').AsString := trim(DBEdit3.Text) + trim(DM.ATqy.FieldByName('区域名称').AsString);
DBDateEdit1.Date := strtodate('19' + copy(id, 7, 2) + '-' + copy(id, 9, 2) + '-' + copy(id, 11, 2));
if odd(strtoint(copy(id, 15, 1))) then
Dm.AQjbxx.FieldByName('性别').AsString := '男'
else
Dm.AQjbxx.FieldByName('性别').AsString := '女';
end;
18: begin
S := 0;
try
for i := 1 to 17 do begin
j := StrToInt(NewID[i]) * W[i];
S := S + j;
end;
except
MessageDlg('身份证有误,请重新输入!', mtError, [mbOK], 0);
end;
S := S mod 11;
if (copy(id, 18, 1) = A[S]) then
begin
NewID := copy(id, 1, 2);
if DM.ATqy.Locate('编码', NewID, []) then
DBEdit3.Text := trim(DM.ATqy.FieldByName('区域名称').AsString);
NewID := copy(id, 1, 4);
if DM.ATqy.Locate('编码', NewID, []) then
DBEdit3.Text := trim(DBEdit3.Text) + trim(DM.ATqy.FieldByName('区域名称').AsString);
NewID := copy(id, 1, 6);
if DM.ATqy.Locate('编码', NewID, []) then
Dm.AQjbxx.FieldByName('籍贯').AsString := trim(DBEdit3.Text) + trim(DM.ATqy.FieldByName('区域名称').AsString);
DBDateEdit1.Date := strtodate(copy(id, 7, 4) + '-' + copy(id, 11, 2) + '-' + copy(id, 13, 2));
if odd(strtoint(copy(id, 17, 1))) then
Dm.AQjbxx.FieldByName('性别').AsString := '男'
else
Dm.AQjbxx.FieldByName('性别').AsString := '女';
end
else begin
MessageDlg('身份证输入错误,请重新输入!', mtError, [mbOK], 0);
end;

end;
else
begin
MessageDlg('身份证输入错误,请重新输入!', mtError, [mbOK], 0);
end;
end;
end;

这是我的源码,自己看看,不懂再说.
966126 2003-10-14
  • 打赏
  • 举报
回复
新号码的最后一位是校验码,根据前面的数字算出来的
966126 2003-10-14
  • 打赏
  • 举报
回复
最后一位x是临时身份证??你听谁说的阿

男单女负是最后第二位
angelior 2003-10-14
  • 打赏
  • 举报
回复
用X代替的是臨時身分証

男的為單數
女的為雙數


并且:你爸為1,你哥為3。。。這樣下去
你媽為2,你姐為5。。。這樣下去,(數字4不用)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧