身份证校验算法swift版本

参考的算法资料

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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
}

自勉,自律

------本文结束感谢阅读------