绿色函数:验证身份证号有效性[转]

原创 2007年10月08日 08:37:00
{验证身份证号有效性,返回值为空代表正常,否则为错误信息}
{作者:月夜风筝,edocu@163.com}
function ValidatePID(const APID: string): string;
{内部函数,取身份证号校验位,最后一位,对18位有效}
function GetVerifyBit(sIdentityNum: string): Char;
var
nNum: Integer;
begin
Result := #0;
nNum := StrToInt(sIdentityNum[1]) * 7 +
StrToInt(sIdentityNum[2]) * 9 +
StrToInt(sIdentityNum[3]) * 10 +
StrToInt(sIdentityNum[4]) * 5 +
StrToInt(sIdentityNum[5]) * 8 +
StrToInt(sIdentityNum[6]) * 4 +
StrToInt(sIdentityNum[7]) * 2 +
StrToInt(sIdentityNum[8]) * 1 +
StrToInt(sIdentityNum[9]) * 6 +
StrToInt(sIdentityNum[10]) * 3 +
StrToInt(sIdentityNum[11]) * 7 +
StrToInt(sIdentityNum[12]) * 9 +
StrToInt(sIdentityNum[13]) * 10 +
StrToInt(sIdentityNum[14]) * 5 +
StrToInt(sIdentityNum[15]) * 8 +
StrToInt(sIdentityNum[16]) * 4 +
StrToInt(sIdentityNum[17]) * 2;
nNum := nNum mod 11;
case nNum of
0: Result := '1';
1: Result := '0';
2: Result := 'X';
3: Result := '9';
4: Result := '8';
5: Result := '7';
6: Result := '6';
7: Result := '5';
8: Result := '4';
9: Result := '3';
10: Result := '2';
end;
end;
var
L : Integer;
sCentury : string;
sYear2Bit : string;
sMonth : string;
sDate : string;
iCentury : Integer;
iMonth : Integer;
iDate : Integer;
CRCFact : string;//18位证号的实际值
CRCTh : string; //18位证号的理论值
FebDayAmt: Byte;//2月天数
begin
L := Length(APID);
if (L in [15, 18]) = False then
begin
Result := Format('身份证号不是15位或18位(%0:s, 实际位数:%1:d)', [APID, L]);
Exit;
end;
CRCFact := '';
if L = 18 then
begin
sCentury := Copy(APID, 7, 2);
iCentury := StrToInt(sCentury);
if (iCentury in [18..20]) = False then
begin
Result := Format('身份证号码无效:18位证号的年份前两位必须在18-20之间(%0:S)', [sCentury]);
Exit;
end;
sYear2Bit := Copy(APID, 9, 2);
sMonth := Copy(APID, 11, 2);
sDate := Copy(APID, 13, 2);
CRCFact := Copy(APID, 18, 1);
end else
begin
sCentury := '19';
sYear2Bit := Copy(APID, 7, 2);
sMonth := Copy(APID, 9, 2);
sDate := Copy(APID, 11, 2);
end;
iMonth := StrToInt(sMonth);
iDate := StrToInt(sDate);
if (iMonth in [01..12]) = False then
begin
Result := Format('身份证号码无效:月份必须在01-12之间(%0:s)', [sMonth]);
Exit;
end;
if (iMonth in [1, 3, 5, 7, 8, 10, 12]) then
begin
if (iDate in [01..31]) = False then
begin
Result := Format('身份证号码无效:日期无效,不能为零或超出当月最大值(%0:s)', [sDate]);
Exit;
end;
end;
if (iMonth in [4, 6, 9, 11]) then
begin
if (iDate in [01..30]) = False then
begin
Result := Format('身份证号码无效:日期无效,不能为零或超出当月最大值(%0:s)', [sDate]);
Exit;
end;
end;
if IsLeapYear(StrToInt(sCentury + sYear2Bit)) = True then
begin
FebDayAmt := 29;
end else
begin
FebDayAmt := 28;
end;
if (iMonth in [2]) then
begin
if (iDate in [01..FebDayAmt]) = False then
begin
Result := Format('身份证号码无效:日期无效,不能为零或超出当月最大值(%0:s)', [sDate]);
Exit;
end;
end;
if CRCFact <> '' then
begin
CRCTh := GetVerifyBit(APID);
if CRCFact <> CRCTh then
begin
Result := Format('身份证号码无效:校验位(第18位)错:(%0:s)', [APID]);
Exit;
end;
end;
end; 

使用Excel的函数批量判断身份证号码是否有效

使用Excel的函数批量判断身份证号码是否有效
  • tongyuehong
  • tongyuehong
  • 2014年12月27日 22:49
  • 3225

Oracle中身份证校验函数

居民身份证号码,根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地...
  • u012104497
  • u012104497
  • 2015年08月07日 10:45
  • 2520

SQLSERVER校验身份证号 合法性

最近在做一个项目时需要在存储过程中判断身份证号的参数的合法性,因此参照网上对应的C++代码改造成SQL SERVER的函数 C++代码的链接:http://blog.chinaunix.net/ui...
  • CHALLENG_EVERYTHING
  • CHALLENG_EVERYTHING
  • 2015年05月19日 18:46
  • 3642

js实现完美身份证号有效性验证

最近需要对身份证合法性进行验证,实名验证是不指望了,不过原来的验证规则太过简单,只是简单的验证了身份证长度,现在业务需要加强下身份证验证规则,网上找到了不少资料,不过都不合偶的心意,无奈只好直接写一个...
  • zjslqshqz
  • zjslqshqz
  • 2017年06月22日 11:30
  • 671

js实现身份证号有效性验证

/* 根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位...
  • mmrsdym
  • mmrsdym
  • 2015年07月30日 14:46
  • 261

js实现完美身份证号有效性验证

/* 根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位...
  • cainiao_ACCP
  • cainiao_ACCP
  • 2017年04月04日 21:12
  • 180

iOS验证身份证号的有效性(仅18位号)

验证身份证号的有效性(仅18位号)。 正则表达式字符串为`"^[1-9][0-9]{5}[1-9][0-9]{3}((0[0-9])|(1[0-2]))(([0|1|2][0-9])|3[0-1])[...
  • u012988591
  • u012988591
  • 2017年03月07日 15:44
  • 236

js实现完美身份证号有效性验证

最近需要对身份证合法性进行验证,实名验证是不指望了,不过原来的验证规则太过简单,只是简单的验证了身份证长度,现在业务需要加强下身份证验证规则,网上找到了不少资料,不过都不合偶的心意,无奈只好直接写一个...
  • baijianjun123456
  • baijianjun123456
  • 2016年08月24日 11:46
  • 582

javascript实现验证身份证号的有效性并提示

使用方法:效果为输入身份证号,焦掉移开后自动验证,并返回信息!
  • xujiangdong1992
  • xujiangdong1992
  • 2017年03月28日 15:58
  • 232

C# 源码 判断 身份证号 有效性

  • 2016年04月23日 09:28
  • 17KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:绿色函数:验证身份证号有效性[转]
举报原因:
原因补充:

(最多只允许输入30个字)