func checkIsIdentityCard(_ identityCard: String) -> Bool {
//判断是否为空
if identityCard.characters.count <= 0 {
return false
}
//判断是否是18位,末尾是否是x
let regex2: String = "^(\\d{14}|\\d{17})(\\d|[xX])$"
let identityCardPredicate = NSPredicate(format: "SELF MATCHES %@", regex2)
if !identityCardPredicate.evaluate(with: identityCard) {
return false
}
//判断生日是否合法
let range = NSRange(location: 6, length: 8)
let datestr: String = (identityCard as NSString).substring(with: range)
let formatter = DateFormatter()
formatter.dateFormat = "yyyyMMdd"
if formatter.date(from: datestr) == nil {
return false
}
//判断校验位
if identityCard.characters.count == 18 {
let idCardWi: [String] = ["7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"]
//将前17位加权因子保存在数组里
let idCardY: [String] = ["1", "0", "10", "9", "8", "7", "6", "5", "4", "3", "2"]
//这是除以11后,可能产生的11位余数、验证码,也保存成数组
var idCardWiSum: Int = 0
//用来保存前17位各自乖以加权因子后的总和
for i in 0..<17 {
idCardWiSum += Int((identityCard as NSString).substring(with: NSRange(location: i, length: 1)))! * Int(idCardWi[i])!
}
let idCardMod: Int = idCardWiSum % 11
//计算出校验码所在数组的位置
let idCardLast: String = identityCard.substring(from: identityCard.index(identityCard.endIndex, offsetBy: -1))
//得到最后一位身份证号码
//如果等于2,则说明校验码是10,身份证号码最后一位应该是X
if idCardMod == 2 {
if idCardLast == "X" || idCardLast == "x" {
return true
} else {
return false
}
} else {
//用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
if (idCardLast as NSString).integerValue == Int(idCardY[idCardMod]) {
return true
} else {
return false
}
}
}
return false
}
身份证校验算法swift版本
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 首先,我们来了解一下身份证的结构 身份证18位分别代表的含义,身份证15位升级到18位,原来年用2位且没有最后一位...
- 前提 我们在平常注册的时候都会校验省份证,但是很少会遇到校验其他证件类型的,今天正好结合ios调用js方法实现这一...
- 二代身份证除了位数和各位表达的含义有限制外,还有一个校验和的问题,这篇文章就是来解决这个问题。网络上应该有对应的J...