臺灣身份證校驗
阿新 • • 發佈:2019-02-12
最近由於專案需要提供一個臺灣版本,其中涉及到實名認證部分。由於臺灣無法使用芝麻認證,只能通過校驗規則來判斷了。綜合網上一些資料,整理了一個方法,記錄以便使用。臺灣的身份證號碼是10位,第一位是字母,第二位數字代表男女,後八位隨機數,最後一位是用於校驗身份證是否有效。
/** 判斷臺灣身份證是否有效 @param str 傳入的身份證號 @return 身份證是否有效 */ + (BOOL)isValidateIDCard:(NSString *)str { NSString *idcard = @"^[a-zA-Z][0-9]{9}$"; NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", idcard]; BOOL firstStep = [regextestmobile evaluateWithObject:str]; if (!firstStep) { return firstStep; } else { NSDictionary *firstCodeDict = @{@"A": @10, @"B": @11, @"C": @12, @"D": @13, @"E": @14, @"F": @15, @"G": @16, @"H": @17, @"J": @18, @"K": @19, @"L": @20, @"M": @21, @"N": @22, @"P": @23, @"Q": @24, @"R": @25, @"S": @26, @"T": @27, @"U": @28, @"V": @29, @"X": @30, @"Y": @31, @"Z": @32, @"W": @33, @"I": @34, @"O": @35, }; NSString *first = [[str substringWithRange:NSMakeRange(0, 1)] uppercaseString]; NSString *mid = [str substringWithRange:NSMakeRange(1, 8)]; NSString *end = [str substringWithRange:NSMakeRange(9, 1)]; NSInteger firstCodeValue = [[firstCodeDict objectForKey:first] integerValue]; NSInteger sum = firstCodeValue / 10 + (firstCodeValue % 10) * 9; NSMutableArray *arr = [NSMutableArray arrayWithCapacity:0]; [mid enumerateSubstringsInRange:NSMakeRange(0, mid.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { [arr addObject:substring]; }]; for (NSInteger i = 8; i > 0; i--) { NSInteger index = [arr[8 - i] integerValue]; sum = sum + index * i; } return (sum % 10 == 0 ? 0 : (10 - sum % 10)) == [end integerValue] ? YES : NO; } }