美文网首页宗布知识库
身份证校验算法swift版本

身份证校验算法swift版本

作者: 8546ed36e321 | 来源:发表于2017-09-02 22:51 被阅读32次
参考的算法资料
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版本

本文链接:https://www.haomeiwen.com/subject/chfdjxtx.html