lua身份证号码验证~
--验证身份证信息
--只支持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身份证号码验证~的更多相关文章
- js正则实现二代身份证号码验证详解
js正则实现二代身份证号码验证详解 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至 ...
- C#实现身份证号码验证的方法
本文实例讲述了C#实现身份证号码验证的方法.分享给大家供大家参考.具体实现方法如下: 随着现在互联网的发展,越来越多的注册用户的地方都用到了身份证,那么对于输入的身份证如何验证呢?看下面的代码,其实很 ...
- 是否以某字符串结尾 是否以某字符串开始 是否是整数 裁减字符串空格 是否是浮点数 是否所有字符为数字类型 是否为空 是否是EMAIL 是否是电话号码 身份证号码验证-支持新的带x身份证 日期验证
/* 1.是否以某字符串结尾 endsWith(theStr,endStr) @param theStr:要判断的字符串 @param endStr:以此字符串结尾 @return boolean; ...
- Java 身份证号码验证
身份证号码验证 1.号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码 2.地址码(前 ...
- Javascript身份证号码验证
"来来来,坐这儿". "什么?我可是有身份的人,怎么能和你坐一块儿".沛笠晃了晃手里的身份证,不屑说道. "你咋不上天呢?有身份还喝油条吃豆浆&quo ...
- js实现身份证号码验证
/*根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数 ...
- js身份证号码验证
验证身份证号码的有效性,包含15位和18位: 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列 ...
- 【Java】身份证号码验证
代码引用自:https://gitee.com/appleat/codes/ynrtqujv0wfgesm8ia9b547 package xxx; /** * Created by wdj on 2 ...
- Java实现身份证号码验证源码分享
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...
随机推荐
- Spring框架中的AOP技术----注解方式
利用AOP技术注解的方式对功能进行增强 CustomerDao接口 package com.alphajuns.demo1; public interface CustomerDao { public ...
- JVM难学?那是因为你没认真看完这篇文章(转)
一:虚拟机内存图解 JAVA程序运行与虚拟机之上,运行时需要内存空间.虚拟机执行JAVA程序的过程中会把它管理的内存划分为不同的数据区域方便管理. 虚拟机管理内存数据区域划分如下图: 数据区域分类: ...
- 并发测试 java.lang.OutOfMemoryError: GC overhead limit exceeded Xms Xmx 阻塞请求 单节点 请求分发 负载均衡
at javax.servlet.http.HttpServlet.service(HttpServlet.java:705) at javax.servlet.http.HttpServlet.se ...
- convention over configuration 约定优于配置 按约定编程 约定大于配置 PEP 20 -- The Zen of Python
为什么说 Java 程序员必须掌握 Spring Boot ?_知识库_博客园 https://kb.cnblogs.com/page/606682/ 为什么说 Java 程序员必须掌握 Spring ...
- event.preventDefault(); Please enter your name using lowercase letters only.
w 可以用于移动实际项目. 输入 android qq输入法 输入第一个字符“中”后 w PC 点击enter键13 空格键32 w 没有阻挡中午输入. CODE <!DOCTYPE html& ...
- Request.RawUrl、Request.Url的区别
如果访问的地址是: http://hovertree.com/guestbook/addmessage.aspx?key=hovertree%3C&n=myslider#zonemenu 那么 ...
- JavaScript 入门之常见对象
常见对象 1. Object 对象 2. String 对象 3. Array 对象 4. Date 对象 5. Number 对象 6. 自定义对象 with 语句 为了简化对象调用内容的书写 格式 ...
- JS取得不同连接的地址,并打开新窗口
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DT ...
- 解决 free(): invalid pointer: 0x00000000019ff700 运行时报错(caffe)(libtool使用)
编译成功,运行时报错: 在使用 pytorch or tensorflow or caffe 时,都可能存在这个问题: *** Error in `xxx': free(): invalid poin ...
- macos没有任何来源怎么解决?
打开终端,输入如下命令即可: sudo spctl --master-disable