IOS身份证校验详细介绍及示例代码
身份证号作为民族国家的一种重要证件,身份证号检验非常重要。本文详细介绍了IOS平台上如何对身份证号进行校验,以及提供了两个示例代码以供参考。
一、身份证号规则
根据我国国家标准GB11643-1999《公民身份号码》规定,身份证号共计18位,其中最后一位是检验位,前17位是表示省市县地区、年月日、顺序号和性别的数字。具体规则如下:
1.前1-6位:表示省市县地区。前两位表示省份,第3-4位表示地级市(直辖市市辖区),第5-6位表示县级行政区。
2.第7-14位:表示出生年月日。格式为YYYYMMDD。
3.第15-17位:表示顺序号。每个人的身份证号码不重复。即便是女性生了多个孩子,其身份证号后三位也不同。
4.第18位:表示校验码。校验码的计算方法为:将前17位数字按照规定的方式进行加权求和,然后将加权和除以11,取余数。余数对应的数字就是校验码。其中10用X来表示,即余数为10时,校验码为X。
二、身份证号校验算法
校验码计算方法如下:
1.将身份证号前17位的数字分别乘以对应的系数,结果相加(注意:系数分别为:7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2)
2.将上述相加结果除以11,得到一个余数
3.将余数根据以下对应规则转换为校验码(0、1、2、3、4、5、6、7、8、9、10转换为1、0、X、9、8、7、6、5、4、3、2)
具体代码实现如下(Swift语言):
func isValidIDNumber(_ idNumber: String) -> Bool {
// 正则表达式判断格式是否正确
let pattern = #"^\d{17}(\d|x|X)$"#
let regex = try! NSRegularExpression(pattern: pattern, options: [])
let range = NSMakeRange(0, idNumber.count)
let results = regex.matches(in: idNumber, options: [], range: range)
if results.count != 1 {
return false
}
// 权重因子
let factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
// 校验码对应值
let checks = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"]
// 获取前17位数字
let startIndex = idNumber.startIndex
let endIndex = idNumber.index(idNumber.endIndex, offsetBy: -1)
let idNumber17 = idNumber[startIndex..<endIndex]
// 计算加权和
var sum = 0
for (i, char) in idNumber17.enumerated() {
let num = Int(String(char))!
sum += num * factors[i]
}
// 计算校验码
let remainder = sum % 11
let checkChar = checks[remainder]
// 校验
let lastChar = idNumber.last!
if lastChar == checkChar {
return true
} else {
return false
}
}
使用示例:
let idNumber = "440983199002122992"
if isValidIDNumber(idNumber) {
print("校验通过")
} else {
print("校验失败")
}
三、身份证校验相关问题
1.如何验证身份证号是否合法?
答:使用以上所给的校验代码即可验证。
2.如何验证身份证号码中的出生日期是否合法?
答:根据身份证号码中的出生年月日进行年月日校验即可。年份范围在1800年至现在,月份为1至12,日期为1至31。
四、示例代码
以一个简单的校验表单为例,用户输入身份证号后,点击“验证”按钮进行校验。
class ViewController: UIViewController {
@IBOutlet weak var idNumberTextField: UITextField!
@IBOutlet weak var resultLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func validateButtonTapped(_ sender: Any) {
let idNumber = idNumberTextField.text ?? ""
if isValidIDNumber(idNumber) {
resultLabel.text = "校验通过"
resultLabel.textColor = UIColor.green
} else {
resultLabel.text = "校验失败"
resultLabel.textColor = UIColor.red
}
}
}
另外一个示例代码是在使用身份证号码进行登录的同时,进行校验,校验通过后才能进行登录。
class LoginViewController: UIViewController {
@IBOutlet weak var idNumberTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
@IBOutlet weak var loginButton: UIButton!
@IBOutlet weak var resultLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// 设置登录按钮不可用
loginButton.isEnabled = false
// 添加两个文本框的事件回调
idNumberTextField.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)
passwordTextField.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)
}
@objc func textFieldDidChange() {
// 判断身份证号码是否合法
let idNumber = idNumberTextField.text ?? ""
if isValidIDNumber(idNumber) {
resultLabel.text = "校验通过"
resultLabel.textColor = UIColor.green
// 如果身份证号码合法,并且密码不为空,则可以点击登录按钮
if let password = passwordTextField.text, !password.isEmpty {
loginButton.isEnabled = true
} else {
loginButton.isEnabled = false
}
} else {
resultLabel.text = "身份证号码不合法"
resultLabel.textColor = UIColor.red
loginButton.isEnabled = false
}
}
@IBAction func loginButtonTapped(_ sender: Any) {
// 进行登录操作
// ...
}
}
以上两个示例代码可以帮助我们更好地理解如何在IOS平台上进行身份证号的校验。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:IOS 身份证校验详细介绍及示例代码 - Python技术站