Swift版身份证号码校验
2016-06-15 16:16
495 查看
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; } }
相关文章推荐
- Apple Swift学习教程
- 介绍 Fedora 上的 Swift
- Swift中实现点击、双击、捏、旋转、拖动、划动、长按手势的类和方法介绍
- Swift自定义iOS中的TabBarController并为其添加动画
- Swift编程中的泛型解析
- Swift中定义二维数组的方法及遍历方法示例
- 简单分析Swift语言的一些基本特征
- 使用 Swift 语言编写 Android 应用入门
- Swift与C语言指针结合使用实例
- Swift心得笔记之控制流
- 用Swift构建一个简单的iOS邮件应用的方法
- 苹果公司推出的新编程语言Swift简介和入门教程
- Swift实现iOS应用中短信验证码倒计时功能的实例分享
- 使用Swift代码实现iOS手势解锁、指纹解锁实例详解
- 探讨Swift数组和字典
- Swift中的指针操作和使用详细介绍
- Swift中使用正则表达式的一些方法
- Swift心得笔记之运算符
- Swift中使用可选类型完美解决占位问题