身份证校验算法swift版本 发表于 2017-09-02 | 分类于 经验心得 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152func 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} ------本文结束感谢阅读------