//身份證號 + (BOOL)CheckIsIdentityCard: (NSString *)identityCard { //判斷是否爲空 if (identityCard==nil||identityCard.length <= 0) { return NO; } //判斷是不是18位,末尾是不是x NSString *regex2 = @"^(\\d{14}|\\d{17})(\\d|[xX])$"; NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2]; if(![identityCardPredicate evaluateWithObject:identityCard]){ return NO; } //判斷生日是否合法 NSRange range = NSMakeRange(6,8); NSString *datestr = [identityCard substringWithRange:range]; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat : @"yyyyMMdd"]; if([formatter dateFromString:datestr]==nil){ return NO; } //判斷校驗位 if(identityCard.length==18) { NSArray *idCardWi= @[ @"7", @"9", @"10", @"5", @"8", @"4", @"2", @"1", @"6", @"3", @"7", @"9", @"10", @"5", @"8", @"4", @"2" ]; //將前17位加權因子保存在數組裏 NSArray * idCardY=@[ @"1", @"0", @"10", @"9", @"8", @"7", @"6", @"5", @"4", @"3", @"2" ]; //這是除以11後,可能產生的11位餘數、驗證碼,也保存成數組 int idCardWiSum=0; //用來保存前17位各自乖以加權因子後的總和 for(int i=0;i<17;i++){ idCardWiSum+=[[identityCard substringWithRange:NSMakeRange(i,1)] intValue]*[idCardWi[i] intValue]; } int idCardMod=idCardWiSum%11;//計算出校驗碼所在數組的位置 NSString *idCardLast=[identityCard substringWithRange:NSMakeRange(17,1)];//獲得最後一位身份證號碼 //若是等於2,則說明校驗碼是10,身份證號碼最後一位應該是X if(idCardMod==2){ if([idCardLast isEqualToString:@"X"]||[idCardLast isEqualToString:@"x"]){ return YES; }else{ return NO; } }else{ //用計算出的驗證碼與最後一位身份證號碼匹配,若是一致,說明經過,不然是無效的身份證號碼 if([idCardLast intValue]==[idCardY[idCardMod] intValue]){ return YES; }else{ return NO; } } } return NO; }