正文

验证身份证号输入的正确性2006-08-10 12:49:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/pblog/17448.html

分享到:

/*-------------------------------------------------------------------------------
* 函数名称:Boolean gf_check_identity(string as_identity)
* 函数功能: 验证身份证号输入的正确性
* 参数说明: string      as_identity    身份证号
* 返 回 值: True  成功
*            False 失败
* 调用举例: gf_check_identity('410101650101101')  
* 尚未完善:没有对身份证号码的第18位校验位进行判断。因为我暂时没有找到第18位
*     的校验算法,等找到了我再加上。应该比较简单。
* 修改日期: 2001-6-20
* 修 改 人: 郭保利
*--------------------------------------------------------------------------------
* 修 改 人: 江松华  Date: 2006.07.13
*--------------------------------------------------------------------------------
* 修改内容:
*    增加了对身份证号码第18位数的验证功能。
*--------------------------------------------------------------------------------*/

String ls_identity_no
String ls_year,ls_month,ls_day,ls_date
String ls_today
Long ll_year
Long ll_identity_no_len

ls_identity_no = as_identity
ls_today = String(Today(),'yyyy/mm/dd')

ll_identity_no_len = Len(ls_identity_no)

IF ls_identity_no = ''  THEN
 MessageBox("系统提示","身份证号码不能为空!!",StopSign!,ok!)
 RETURN FALSE
ELSEIF ll_identity_no_len <> 15 AND ll_identity_no_len <> 18 THEN
 MessageBox("系统提示","身份证号码位数不足,请检查输入情况!!",StopSign!,ok!)
 RETURN FALSE
END IF

IF ll_identity_no_len = 15 THEN //身份证为 15 处理,  认为15位的年 = 19**
 ls_year = Mid(ls_identity_no, 7, 2)
 ls_month = Mid(ls_identity_no, 9, 2)
 ls_day = Mid(ls_identity_no, 11, 2)
 ls_year = '19' + ls_year //year is only 20 century
 ls_date = ls_year +'/' + ls_month +'/' + ls_day
ELSE
 ls_year = Mid(ls_identity_no, 7, 4)
 IF Left(ls_year,2) <> '19' AND Left(ls_year,2) <> '20' THEN
  MessageBox("系统提示","身份证号码中的出生年份不正确, 请您重新输入! ",StopSign!,ok!)
  RETURN FALSE
 END IF
 ls_month = Mid(ls_identity_no, 11, 2)
 ls_day = Mid(ls_identity_no, 13, 2)
 ls_date = ls_year +'/' + ls_month +'/' + ls_day
END IF

IF ls_month > '12' THEN
 MessageBox("系统提示","身份证号码中的出生月份大于12, 请您重新输入!",StopSign!,ok!)
 RETURN FALSE
ELSEIF ls_month < '01' THEN
 MessageBox("系统提示","身份证号码中的出生月份小于01, 请您重新输入!",StopSign!,ok!)
 RETURN FALSE
END IF

IF ls_day < '01' THEN
 MessageBox("系统提示","身份证号码的出生日小于01, 请您重新输入!",StopSign!,ok!)
 RETURN FALSE
END IF

CHOOSE CASE ls_month
 CASE '01','03','05','07','08','10','12' //大月的处理
  IF ls_day > '31' THEN
   MessageBox("系统提示","身份证号码的出生日大于31, 请您重新输入!",StopSign!,ok!)
   RETURN FALSE
  END IF
  
 CASE '04','06','05','09','11' //小月的处理
  IF ls_day > '30' THEN
   MessageBox("系统提示","身份证号码的出生日大于30, 请您重新输入!",StopSign!,ok!)
   RETURN FALSE
  END IF
 CASE '02' //平年和闰年的处理
  ll_year = Long(ls_year)
  If (Mod(ll_year,4) = 0 AND Mod(ll_year,100) <> 0) Or (Mod(ll_year,400) = 0) THEN //闰年,二月份不能多于29天
   IF ls_day > '29' THEN
    MessageBox("系统提示","闰年的二月份没有" + ls_day + "日,请重新输入出生日期!",StopSign!,ok!)
    RETURN FALSE
   END IF
  ELSE //平年二月份不能大于28天
   IF ls_day > '28' THEN
    MessageBox("系统提示","平年的二月份没有" + ls_day + "日,请重新输入出生日期!",StopSign!,ok!)
    RETURN FALSE
   END IF
  END IF
END CHOOSE

IF ls_date > ls_today THEN
 MessageBox("系统提示","身份证号码的出生日期小于登记日期,不合理请您重新输入!",StopSign!,ok!)
 RETURN FALSE
END IF


//====================================================================
// 对身份证第18位进行验证
//====================================================================
Integer li_idh[] // 用来保存18位身份证中前17位号码
Integer li_w[]  // 保存与17位身份证计算的17个因数
String ls_y[]  // 保存身份证前17位计算后对应的最后一位数
Integer li_len, li_sum, li_y

li_w[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}
ls_y[] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'}

IF ll_identity_no_len = 18 THEN
 FOR li_len = 1 TO 17
  li_idh[li_len] = Integer (Mid (ls_identity_no, li_len, 1))
  li_sum += li_idh[li_len] * li_w[li_len]
 NEXT
 
 li_y = Mod (li_sum, 11) + 1 // 总数对11求模
 
 IF ls_y[li_y] <> Upper (Right (ls_identity_no,1)) THEN
  MessageBox("系统提示","身份证号码的最后一位验证没有通过,请检查!", StopSign!, ok!)
  RETURN FALSE
 END IF
END IF

RETURN TRUE

 

 

阅读(4620) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册