--验证身份证信息
--只支持18位身份证的验证 --[[
#身份证18位编码规则:dddddd yyyymmdd xxx y
#dddddd:地区码
#yyyymmdd: 出生年月日
#xxx:顺序类编码,无法确定,奇数为男,偶数为女
#y: 校验码,该位数值可通过前17位计算获得
#<p />
#18位号码加权因子为(从右到左) Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,1 ]
#验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]
#校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 )
#i为身份证号码从右往左数的 2...18 位; Y_P为脚丫校验码所在校验码数组位置
参考代码:
https://github.com/yujinqiu/idlint
]]
local string_len = string.len
local tonumber = tonumber -- // wi =2(n-1)(mod 11)
local wi = { , , , , , , , , , , , , , , , , , };
-- // verify digit
local vi= { '', '', 'X', '', '', '', '', '', '', '', '' }; local function isBirthDate(date)
local year = tonumber(date:sub(,))
local month = tonumber(date:sub(,))
local day = tonumber(date:sub(,))
if year < or year > or month > or month < then
return false
end
-- //月份天数表
local month_days = {, , , , , , , , , , , };
local bLeapYear = (year % == and year % ~= ) or (year % == )
if bLeapYear then
month_days[] = ;
end if day > month_days[month] or day < then
return false
end return true
end local function isAllNumberOrWithXInEnd( str )
local ret = str:match("%d+X?")
return ret == str
end local function checkSum(idcard)
-- copy from http://stackoverflow.com/questions/829063/how-to-iterate-individual-characters-in-lua-string
local nums = {}
local _idcard = idcard:sub(,)
for ch in _idcard:gmatch"." do
table.insert(nums,tonumber(ch))
end
local sum =
for i,k in ipairs(nums) do
sum = sum + k * wi[i]
end return vi [sum % +] == idcard:sub(, )
end local err_success =
local err_length =
local err_province =
local err_birth_date =
local err_code_sum =
local err_unknow_charactor = local function verifyIDCard(idcard)
if string_len(idcard) ~= then
return err_length
end if not isAllNumberOrWithXInEnd(idcard) then
return err_unknow_charactor
end
-- //第1-2位为省级行政区划代码,[11, 65] (第一位华北区1,东北区2,华东区3,中南区4,西南区5,西北区6)
local nProvince = tonumber(idcard:sub(, ))
if( nProvince < or nProvince > ) then
return err_province
end -- //第3-4为为地级行政区划代码,第5-6位为县级行政区划代码因为经常有调整,这块就不做校验 -- //第7-10位为出生年份;//第11-12位为出生月份 //第13-14为出生日期
if not isBirthDate(idcard:sub(,)) then
return err_birth_date
end if not checkSum(idcard) then
return err_code_sum
end return err_success
end local function UnitTest_CheckBirthDay()
assert(isBirthDate('') == true)
assert(isBirthDate('') == false)
assert(isBirthDate('') == false)
assert(isBirthDate('') == true)
assert(isBirthDate('') == true)
assert(isBirthDate('') == false)
assert(isBirthDate('') == true)
assert(isBirthDate('') == false) end local function UnitTest()
print('begin UnitTest')
UnitTest_CheckBirthDay()
assert(verifyIDCard('') == err_code_sum)
assert(verifyIDCard('4113021988112864x7') == err_unknow_charactor)
assert(verifyIDCard('') == err_length)
end UnitTest()

手游项目中需要实名需求,项目是lua写的,github上找了下没有找到lua的实现,只看到了c++,python,js.于是仿照其中的c++,移植到lua.

lua身份证号码验证~的更多相关文章

  1. js正则实现二代身份证号码验证详解

    js正则实现二代身份证号码验证详解 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至 ...

  2. C#实现身份证号码验证的方法

    本文实例讲述了C#实现身份证号码验证的方法.分享给大家供大家参考.具体实现方法如下: 随着现在互联网的发展,越来越多的注册用户的地方都用到了身份证,那么对于输入的身份证如何验证呢?看下面的代码,其实很 ...

  3. 是否以某字符串结尾 是否以某字符串开始 是否是整数 裁减字符串空格 是否是浮点数 是否所有字符为数字类型 是否为空 是否是EMAIL 是否是电话号码 身份证号码验证-支持新的带x身份证 日期验证

    /* 1.是否以某字符串结尾 endsWith(theStr,endStr) @param theStr:要判断的字符串 @param endStr:以此字符串结尾 @return boolean; ...

  4. Java 身份证号码验证

    身份证号码验证 1.号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码 2.地址码(前 ...

  5. Javascript身份证号码验证

    "来来来,坐这儿". "什么?我可是有身份的人,怎么能和你坐一块儿".沛笠晃了晃手里的身份证,不屑说道. "你咋不上天呢?有身份还喝油条吃豆浆&quo ...

  6. js实现身份证号码验证

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

  7. js身份证号码验证

    验证身份证号码的有效性,包含15位和18位: 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列 ...

  8. 【Java】身份证号码验证

    代码引用自:https://gitee.com/appleat/codes/ynrtqujv0wfgesm8ia9b547 package xxx; /** * Created by wdj on 2 ...

  9. Java实现身份证号码验证源码分享

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

随机推荐

  1. Spring框架中的AOP技术----注解方式

    利用AOP技术注解的方式对功能进行增强 CustomerDao接口 package com.alphajuns.demo1; public interface CustomerDao { public ...

  2. JVM难学?那是因为你没认真看完这篇文章(转)

    一:虚拟机内存图解 JAVA程序运行与虚拟机之上,运行时需要内存空间.虚拟机执行JAVA程序的过程中会把它管理的内存划分为不同的数据区域方便管理. 虚拟机管理内存数据区域划分如下图: 数据区域分类: ...

  3. 并发测试 java.lang.OutOfMemoryError: GC overhead limit exceeded Xms Xmx 阻塞请求 单节点 请求分发 负载均衡

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:705) at javax.servlet.http.HttpServlet.se ...

  4. convention over configuration 约定优于配置 按约定编程 约定大于配置 PEP 20 -- The Zen of Python

    为什么说 Java 程序员必须掌握 Spring Boot ?_知识库_博客园 https://kb.cnblogs.com/page/606682/ 为什么说 Java 程序员必须掌握 Spring ...

  5. event.preventDefault(); Please enter your name using lowercase letters only.

    w 可以用于移动实际项目. 输入 android qq输入法 输入第一个字符“中”后 w PC 点击enter键13 空格键32 w 没有阻挡中午输入. CODE <!DOCTYPE html& ...

  6. Request.RawUrl、Request.Url的区别

    如果访问的地址是: http://hovertree.com/guestbook/addmessage.aspx?key=hovertree%3C&n=myslider#zonemenu 那么 ...

  7. JavaScript 入门之常见对象

    常见对象 1. Object 对象 2. String 对象 3. Array 对象 4. Date 对象 5. Number 对象 6. 自定义对象 with 语句 为了简化对象调用内容的书写 格式 ...

  8. JS取得不同连接的地址,并打开新窗口

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DT ...

  9. 解决 free(): invalid pointer: 0x00000000019ff700 运行时报错(caffe)(libtool使用)

    编译成功,运行时报错: 在使用 pytorch or tensorflow or caffe 时,都可能存在这个问题: *** Error in `xxx': free(): invalid poin ...

  10. macos没有任何来源怎么解决?

    打开终端,输入如下命令即可: sudo spctl --master-disable