身份证号码校验,server端和app端都可以实现。下面实现swift3.0 校验身份证号码是否合法。用swfit 3.0 的String字符串截取
Swift 3的String有三个方法用于做字符串截取
tr.substring(to: String.Index)
str.substring(from: String.Index)
str.substring(with: Range<String.Index>)
用法示例:
var str = "Hello, World"
//这个方法会从字符串的开始截取到to参数指定的索引
str.substring(to: String.Index)
let index = str.index(str.startIndex, offsetBy: 5) //索引为从开始偏移5个位置
str.substring(to: index) // 获取Hello
//这个方法会从from参数指定的索引截取到字符串的末尾
substring(from: String.Index)
let index = str.index(str.startIndex, offsetBy: 7) //索引从开始偏移7个位置
str.substring(from: index) // 输出World
//这个方法是截取指定的字符串范围,范围由Range指定
str.substring(with: Range<String.Index>)
let start = str.index(str.startIndex, offsetBy: 7) //索引从开始偏移7个位置
let end = str.index(str.endIndex, offsetBy: -3) //所有从末尾往回偏移三个位置
let range = start..<end
str.substring(with: range) // 输出Wo
校验身份证号码是否合法:
func validateIDCardNumber(sfz: String) -> Bool {
let value = sfz.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines)
var length = 0
if value == "" {
return false
} else {
length = value.characters.count
if length != 15 && length != 18 {
return false
}
}
//省份代码
let arearsArray = ["11","12", "13", "14", "15", "21", "22", "23", "31", "32", "33", "34", "35", "36", "37", "41", "42", "43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63", "64", "65", "71", "81", "82", "91"]
let valueStart2 = value.substring(to: value.index(value.startIndex, offsetBy: 2))
var arareFlag = false
if arearsArray.contains(valueStart2) {
arareFlag = true
}
if !arareFlag {
return false
}
var regularExpression = NSRegularExpression()
var numberofMatch = Int()
var year = 0
switch (length) {
case 15:
year = Int(value.substring(with: value.index(value.startIndex, offsetBy: 5)..<value.index(value.startIndex, offsetBy: 9)))!
if year%4 == 0 || (year%100 == 0 && year%4 == 0) {
do {
regularExpression = try NSRegularExpression.init(pattern: "^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$", options: .caseInsensitive) //检测出生日期的合法性
} catch { }
} else {
do {
regularExpression = try NSRegularExpression.init(pattern: "^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$", options: .caseInsensitive) //检测出生日期的合法性
} catch { }
}
numberofMatch = regularExpression.numberOfMatches(in: value, options:NSRegularExpression.MatchingOptions.reportProgress, range: NSMakeRange(0, value.characters.count))
if (numberofMatch > 0) {
return true
} else {
return false
}
case 18:
year = Int(value.substring(with: value.index(value.startIndex, offsetBy: 6)..<value.index(value.startIndex, offsetBy: 10)))!
if year%4 == 0 || (year%100 == 0 && year%4 == 0) {
do {
regularExpression = try NSRegularExpression.init(pattern: "^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$", options: .caseInsensitive) //检测出生日期的合法性
} catch { }
} else {
do {
regularExpression = try NSRegularExpression.init(pattern: "^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$", options: .caseInsensitive) //检测出生日期的合法性
} catch { }
}
numberofMatch = regularExpression.numberOfMatches(in: value, options:NSRegularExpression.MatchingOptions.reportProgress, range: NSMakeRange(0, value.characters.count))
if(numberofMatch > 0) {
let s =
(Int(value.substring(with: value.startIndex..<value.index(value.startIndex, offsetBy: 1)))! +
Int(value.substring(with: value.index(value.startIndex, offsetBy: 10)..<value.index(value.startIndex, offsetBy: 11)))!) * 7 +
(Int(value.substring(with: value.index(value.startIndex, offsetBy: 1)..<value.index(value.startIndex, offsetBy: 2)))! +
Int(value.substring(with: value.index(value.startIndex, offsetBy: 11)..<value.index(value.startIndex, offsetBy: 12)))!) * 9 +
(Int(value.substring(with: value.index(value.startIndex, offsetBy: 2)..<value.index(value.startIndex, offsetBy: 3)))! +
Int(value.substring(with: value.index(value.startIndex, offsetBy: 12)..<value.index(value.startIndex, offsetBy: 13)))!) * 10 +
(Int(value.substring(with: value.index(value.startIndex, offsetBy: 3)..<value.index(value.startIndex, offsetBy: 4)))! +
Int(value.substring(with: value.index(value.startIndex, offsetBy: 13)..<value.index(value.startIndex, offsetBy: 14)))!) * 5 +
(Int(value.substring(with: value.index(value.startIndex, offsetBy: 4)..<value.index(value.startIndex, offsetBy: 5)))! +
Int(value.substring(with: value.index(value.startIndex, offsetBy: 14)..<value.index(value.startIndex, offsetBy: 15)))!) * 8 +
(Int(value.substring(with: value.index(value.startIndex, offsetBy: 5)..<value.index(value.startIndex, offsetBy: 6)))! +
Int(value.substring(with: value.index(value.startIndex, offsetBy: 15)..<value.index(value.startIndex, offsetBy: 16)))!) * 4 +
(Int(value.substring(with: value.index(value.startIndex, offsetBy: 6)..<value.index(value.startIndex, offsetBy: 7)))! +
Int(value.substring(with: value.index(value.startIndex, offsetBy: 16)..<value.index(value.startIndex, offsetBy: 17)))!) * 2 +
Int(value.substring(with: value.index(value.startIndex, offsetBy: 7)..<value.index(value.startIndex, offsetBy: 8)))! * 1 +
Int(value.substring(with: value.index(value.startIndex, offsetBy: 8)..<value.index(value.startIndex, offsetBy: 9)))! * 6 +
Int(value.substring(with: value.index(value.startIndex, offsetBy: 9)..<value.index(value.startIndex, offsetBy: 10)))! * 3
let Y = s%11
var M = "F"
let JYM = "10X98765432"
M = JYM.substring(with: JYM.index(JYM.startIndex, offsetBy: Y)..<JYM.index(JYM.startIndex, offsetBy: Y + 1))
if M == value.substring(with: value.index(value.startIndex, offsetBy: 17)..<value.index(value.startIndex, offsetBy: 18)) {
return true
} else {
return false
}
} else {
return false
}
default:
return false
}
}