Swift版身份证号码校验

来源:互联网 发布:李荣浩祝你幸福知乎 编辑:程序博客网 时间:2024/05/18 17:01

Swift版身份证号码校验

最近写用swift开发项目,在网上找了很多关于身份证号码校验的文章都没有能达到精准校验的效果,为此,我写了一个swift版本:

 extension NSString {    /*!     验证手机号是否合法     - returns: true/false     */    func isValidateTelNumber() -> Bool {        return validate("^1(3[0-9]|4[57]|5[0-35-9]|8[0-9]|7[06-8])\\d{8}$")    }    /*!     验证身份证     - returns: true/false     */    func chk18PaperId() -> Bool {        //判断位数        if self.length != 15 && self.length != 18 {            return false        }        var carid = self        var lSumQT = 0        //加权因子        let R = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]        //校验码        let sChecker: [Int8] = [49,48,88, 57, 56, 55, 54, 53, 52, 51, 50]        //将15位身份证号转换成18位        let mString = NSMutableString.init(string: self)        if self.length == 15 {            mString.insertString("19", atIndex: 6)            var p = 0            let pid = mString.UTF8String            for i in 0...16 {                p += (pid[i]-48) * R[i]            }            let o = p % 11            let stringContent = NSString(format: "%c", sChecker[o])            mString.insertString(stringContent as String, atIndex: mString.length)            carid = mString        }        //判断地区码        let sProvince = carid.substringToIndex(2)        if (!areaCodeAt(sProvince)) {            return false        }        //判断年月日是否有效        //年份        let strYear = Int(carid.substringWithRange(NSMakeRange(6, 4)))        //月份        let strMonth = Int(carid.substringWithRange(NSMakeRange(10, 2)))        //日        let strDay = Int(carid.substringWithRange(NSMakeRange(12, 2)))        let localZone = NSTimeZone.localTimeZone()        let dateFormatter = NSDateFormatter()        dateFormatter.dateStyle = .MediumStyle        dateFormatter.timeStyle = .NoStyle        dateFormatter.timeZone = localZone        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"        let date = dateFormatter.dateFromString("\(String(format: "%02d",strYear!))-\(String(format: "%02d",strMonth!))-\(String(format: "%02d",strDay!)) 12:01:01")        if date == nil {            return false        }        let paperId = carid.UTF8String        //检验长度        if 18 != carid.length {            return false        }        //校验数字        func isDigit(c: Int8) -> Bool {            return 0 <= c && c <= 9        }        for i in 0...18 {            if isDigit(paperId[i]) && !(88 == paperId[i] || 120 == paperId[i]) && 17 == i {                return false            }        }        //验证最末的校验码        for i in 0...16 {            lSumQT += (paperId[i]-48) * R[i]        }        if sChecker[lSumQT%11] != paperId[17] {            return false        }        return true    }    func areaCodeAt(code: String) -> Bool {        var dic: [String: String] = [:]        dic["11"] = "北京"        dic["12"] = "天津"        dic["13"] = "河北"        dic["14"] = "山西"        dic["15"] = "内蒙古"        dic["21"] = "辽宁"        dic["22"] = "吉林"        dic["23"] = "黑龙江"        dic["31"] = "上海"        dic["32"] = "江苏"        dic["33"] = "浙江"        dic["34"] = "安徽"        dic["35"] = "福建"        dic["36"] = "江西"        dic["37"] = "山东"        dic["41"] = "河南"        dic["42"] = "湖北"        dic["43"] = "湖南"        dic["44"] = "广东"        dic["45"] = "广西"        dic["46"] = "海南"        dic["50"] = "重庆"        dic["51"] = "四川"        dic["52"] = "贵州"        dic["53"] = "云南"        dic["54"] = "西藏"        dic["61"] = "陕西"        dic["62"] = "甘肃"        dic["63"] = "青海"        dic["64"] = "宁夏"        dic["65"] = "新疆"        dic["71"] = "台湾"        dic["81"] = "香港"        dic["82"] = "澳门"        dic["91"] = "国外"        if (dic[code] == nil) {            return false;        }        return true;    }}
0 0