身份证号校验 swift版

这是一个用于验证中国居民身份证号码(ID卡号)正确性的工具类。它包含一系列私有方法,如提取子字符串、计算校验码等,并提供了一个公共方法`checkID`来检查输入的ID号是否有效。该方法会检查长度、日期格式、校验码等多个方面来确保ID号的合法性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class IDCardNoChecker {
    static let share = IDCardNoChecker()
    
    private func substring(src:String, from:Int, length:Int)->String{
        let start = src.index(src.startIndex, offsetBy: from)
        let end = src.index(start, offsetBy: length)
        return String(src[start..<end])
    }
    private let iWeight:[Int] = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    private let sChecker:[Character] = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"]
    private func getIDCardNoCheckSum(ID:String)->Character{
        var sum = 0
        for i in 0...16 {
            let index = ID.index(ID.startIndex, offsetBy: i)
            sum += (Int(ID[index].asciiValue!) - 48)*iWeight[i]
        }
        return sChecker[sum%11]
    }

    public func checkID(IDNo:String) -> Bool {
        if IDNo.isEmpty || IDNo.count != 18 {
            return false
        }
        let ID = IDNo.uppercased()
        var id = ID
        if id.last == "X" {
            id.removeLast()
        }
        let deleteDigit = id.trimmingCharacters(in: .decimalDigits)
        if !deleteDigit.isEmpty {
            return false
        }
        
        let y = UInt( substring(src: ID, from: 6, length: 4) )!
        let m = UInt( substring(src: ID, from: 10, length: 2) )!
        let d = UInt( substring(src: ID, from: 12, length: 2) )!
        
        guard y>1000 && y<9999 && m>0 && m<=12 && d>0 && d<=31 else {
            return false
        }
        
        let checkSum = getIDCardNoCheckSum(ID: ID)
        if ID[ID.index(ID.startIndex, offsetBy: 17)] != checkSum {
            return false
        }

        return true
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值