// // StringUtil.m // airtree // // Created by WindShan on 2016/11/14. // Copyright © 2016年 Gloria. All rights reserved. // #import "StringUtil.h" @implementation StringUtil static char fxTwoCharToHex(char a, char b) { char encoder[3] = {0,0,0}; encoder[0] = a; encoder[1] = b; return (char) strtol(encoder,NULL,16); } + (void)convertString:(NSString *)source toHexBytes:(unsigned char *)hexBuffer { const char * bytes = [source cStringUsingEncoding:NSASCIIStringEncoding]; unsigned char * index = hexBuffer; while ((*bytes) && (*(bytes +1))) { *index = fxTwoCharToHex(*bytes, *(bytes + 1)); ++index; bytes += 2; } *index = 0; } + (NSString *)intervalFromNowTime { NSTimeInterval interval = [[NSDate date] timeIntervalSince1970]; return [NSString stringWithFormat:@"%ld", (long)interval]; } + (NSString *)deleteChinesSpace:(NSString *)sourceText { return [sourceText stringByReplacingOccurrencesOfString:@" " withString:@""]; } +(NSString *)stringFromObject:(id)obj { NSString *ret = nil; if ([obj isKindOfClass:[NSNumber class]]) { ret = [NSString stringWithFormat:@"%ld", [obj longValue]]; } else { ret = obj; } return ret; } + (BOOL) isMobile:(NSString *)mobileNumbel { /** * 手机号码 * 移动:134[0-8],135,136,137,138,139,147,150,151,157,158,159,182,187,188 * 联通:130,131,132,152,155,156,185,186 * 电信:133,1349,153,180,189,181(增加) */ NSString * MOBIL = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$"; /** 10 * 中国移动:China Mobile 11 * 134[0-8],135,136,137,138,139,147,150,151,157,158,159,182,187,188 12 */ NSString * CM = @"^1(34[0-8]|47[0-9]|(3[5-9]|5[017-9]|8[2378])\\d)\\d{7}$"; /** 15 * 中国联通:China Unicom 16 * 130,131,132,152,155,156,185,186 17 */ NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$"; /** 20 * 中国电信:China Telecom 21 * 133,1349,153,180,189,181(增加) 22 */ NSString * CT = @"^1((33|53|77|8[019])[0-9]|349)\\d{7}$"; NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBIL]; NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM]; NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU]; NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT]; if (([regextestmobile evaluateWithObject:mobileNumbel] || [regextestcm evaluateWithObject:mobileNumbel] || [regextestct evaluateWithObject:mobileNumbel] || [regextestcu evaluateWithObject:mobileNumbel])) { return YES; } return NO; } //邮箱地址的正则表达式 + (BOOL)isValidateEmail:(NSString *)email { NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; return [emailTest evaluateWithObject:email]; } //车牌号验证 + (BOOL) validateCarNo:(NSString *)carNo { NSString *carRegex = @"^[\u4e00-\u9fa5]{1}[a-zA-Z]{1}[a-zA-Z_0-9]{4}[a-zA-Z_0-9_\u4e00-\u9fa5]$"; NSPredicate *carTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",carRegex]; return [carTest evaluateWithObject:carNo]; } //车型 + (BOOL) validateCarType:(NSString *)CarType { NSString *CarTypeRegex = @"^[\u4E00-\u9FFF]+$"; NSPredicate *carTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",CarTypeRegex]; return [carTest evaluateWithObject:CarType]; } //用户名 + (BOOL) validateUserName:(NSString *)name { NSString *userNameRegex = @"^[A-Za-z0-9]{6,20}+$"; NSPredicate *userNamePredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",userNameRegex]; return [userNamePredicate evaluateWithObject:name]; } //密码验证 + (BOOL) validatePassword:(NSString *)passWord { NSString *passWordRegex = @"^[a-zA-Z0-9]{6,20}+$"; NSPredicate *passWordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",passWordRegex]; return [passWordPredicate evaluateWithObject:passWord]; } //昵称验证 + (BOOL) validateNickname:(NSString *)nickname { NSString *nicknameRegex = @"^[\u4e00-\u9fa5]{4,8}$"; NSPredicate *passWordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",nicknameRegex]; return [passWordPredicate evaluateWithObject:nickname]; } //身份证号验证 验证身份证号(15位或18位数字)【最全的身份证校验,带校验位】 + (BOOL) validateIdentityCard: (NSString *)idCardNumberStr { idCardNumberStr = [idCardNumberStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; NSInteger length = 0; if (!idCardNumberStr) { return NO; } else { length = idCardNumberStr.length; if (length != 15 && length !=18) { return NO; } } /*! 省份代码 */ NSArray *areasArray =@[@"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"]; NSString *valueStart2 = [idCardNumberStr substringToIndex:2]; BOOL areaFlag = NO; for (NSString *areaCode in areasArray) { if ([areaCode isEqualToString:valueStart2]) { areaFlag =YES; break; } } if (!areaFlag) { return NO; } NSRegularExpression *regularExpression; NSUInteger numberofMatch; NSInteger year = 0; switch (length) { case 15: year = [idCardNumberStr substringWithRange:NSMakeRange(6,2)].intValue +1900; if (year % 4 ==0 || (year % 100 ==0 && year % 4 ==0)) { /*! 测试出生日期的合法性 */ regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[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:NSRegularExpressionCaseInsensitive error:nil]; } else { /*! 测试出生日期的合法性 */ regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[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:NSRegularExpressionCaseInsensitive error:nil]; } numberofMatch = [regularExpression numberOfMatchesInString:idCardNumberStr options:NSMatchingReportProgress range:NSMakeRange(0, idCardNumberStr.length)]; if(numberofMatch > 0) { return YES; } else { return NO; } break; case 18: year = [idCardNumberStr substringWithRange:NSMakeRange(6,4)].intValue; if (year % 4 ==0 || (year % 100 ==0 && year % 4 ==0)) { /*! 测试出生日期的合法性 */ regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[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:NSRegularExpressionCaseInsensitive error:nil]; } else { /*! 测试出生日期的合法性 */ regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[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:NSRegularExpressionCaseInsensitive error:nil]; } numberofMatch = [regularExpression numberOfMatchesInString:idCardNumberStr options:NSMatchingReportProgress range:NSMakeRange(0, idCardNumberStr.length)]; if(numberofMatch > 0) { NSInteger S = ([idCardNumberStr substringWithRange:NSMakeRange(0,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(10,1)].intValue) *7 + ([idCardNumberStr substringWithRange:NSMakeRange(1,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(11,1)].intValue) *9 + ([idCardNumberStr substringWithRange:NSMakeRange(2,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(12,1)].intValue) *10 + ([idCardNumberStr substringWithRange:NSMakeRange(3,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(13,1)].intValue) *5 + ([idCardNumberStr substringWithRange:NSMakeRange(4,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(14,1)].intValue) *8 + ([idCardNumberStr substringWithRange:NSMakeRange(5,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(15,1)].intValue) *4 + ([idCardNumberStr substringWithRange:NSMakeRange(6,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(16,1)].intValue) *2 + [idCardNumberStr substringWithRange:NSMakeRange(7,1)].intValue *1 + [idCardNumberStr substringWithRange:NSMakeRange(8,1)].intValue *6 + [idCardNumberStr substringWithRange:NSMakeRange(9,1)].intValue *3; NSInteger Y = S % 11; NSString *M = @"F"; NSString *JYM = @"10X98765432"; /*! 判断校验位 */ M = [JYM substringWithRange:NSMakeRange(Y,1)]; if ([M isEqualToString:[idCardNumberStr substringWithRange:NSMakeRange(17,1)]]) { /*! 检测ID的校验位 */ return YES; } else { return NO; } } else { return NO; } break; default: return NO; break; } } #pragma mark - ***** 验证IP地址(15位或18位数字) + (BOOL)ba_isIPAddress:(NSString *)iPAddressStr { NSString *pattern = @"((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)"; NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; NSArray *results = [regex matchesInString:iPAddressStr options:0 range:NSMakeRange(0, iPAddressStr.length)]; return results.count > 0; } #pragma mark - ***** 验证输入的是否是URL地址 + (BOOL)ba_isUrl:(NSString *)urlStr { // NSString* verifyRules=@"^http://([\\w-]+\.)+[\\w-]+(/[\\w-./?%&=]*)?$"; // NSPredicate *verifyRulesPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",verifyRules]; // return [verifyRulesPre evaluateWithObject:urlStr]; NSString *pattern = @"\\b(([\\w-]+://?|www[.])[^\\s()<>]+(?:\\([\\w\\d]+\\)|([^[:punct:]\\s]|/)))"; NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; NSArray *results = [regex matchesInString:urlStr options:0 range:NSMakeRange(0, urlStr.length)]; return results.count > 0; } #pragma mark - ***** 工商税号验证 + (BOOL)ba_isValidTaxNo:(NSString *)taxNo { NSString *taxNoRegex = @"[0-9]\\d{13}([0-9]|X)$"; NSPredicate *taxNoPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",taxNoRegex]; return [taxNoPredicate evaluateWithObject:taxNo]; } #pragma mark - ***** Mac地址有效性验证 + (BOOL)ba_isMacAddress:(NSString *)macAddress { NSString *macAddRegex = @"([A-Fa-f\\d]{2}:){5}[A-Fa-f\\d]{2}"; NSPredicate *macAddressPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",macAddRegex]; return [macAddressPredicate evaluateWithObject:macAddress]; } /** 银行卡号有效性问题Luhn算法 * 现行 16 位银联卡现行卡号开头 6 位是 622126~622925 之间的,7 到 15 位是银行自定义的, * 可能是发卡分行,发卡网点,发卡序号,第 16 位是校验码。 * 16 位卡号校验位采用 Luhm 校验方法计算: * 1,将未带校验位的 15 位卡号从右依次编号 1 到 15,位于奇数位号上的数字乘以 2 * 2,将奇位乘积的个十位全部相加,再加上所有偶数位上的数字 * 3,将加法和加上校验位能被 10 整除。 */ #pragma mark - ***** 银行卡号有效性问题Luhn算法 + (BOOL)ba_isBankCardlNumCheck:(NSString *)bankCardlNum { NSString *lastNum = [[bankCardlNum substringFromIndex:(bankCardlNum.length-1)] copy];//取出最后一位 NSString *forwardNum = [[bankCardlNum substringToIndex:(bankCardlNum.length -1)] copy];//前15或18位 NSMutableArray * forwardArr = [[NSMutableArray alloc] initWithCapacity:0]; for (int i=0; i -1; i--) {//前15位或者前18位倒序存进数组 [forwardDescArr addObject:forwardArr[i]]; } NSMutableArray * arrOddNum = [[NSMutableArray alloc] initWithCapacity:0];//奇数位*2的积 < 9 NSMutableArray * arrOddNum2 = [[NSMutableArray alloc] initWithCapacity:0];//奇数位*2的积 > 9 NSMutableArray * arrEvenNum = [[NSMutableArray alloc] initWithCapacity:0];//偶数位数组 for (int i=0; i< forwardDescArr.count; i++) { NSInteger num = [forwardDescArr[i] intValue]; if (i%2) {//偶数位 [arrEvenNum addObject:[NSNumber numberWithInteger:num]]; } else {//奇数位 if (num * 2 < 9) { [arrOddNum addObject:[NSNumber numberWithInteger:num * 2]]; } else { NSInteger decadeNum = (num * 2) / 10; NSInteger unitNum = (num * 2) % 10; [arrOddNum2 addObject:[NSNumber numberWithInteger:unitNum]]; [arrOddNum2 addObject:[NSNumber numberWithInteger:decadeNum]]; } } } __block NSInteger sumOddNumTotal = 0; [arrOddNum enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL *stop) { sumOddNumTotal += [obj integerValue]; }]; __block NSInteger sumOddNum2Total = 0; [arrOddNum2 enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL *stop) { sumOddNum2Total += [obj integerValue]; }]; __block NSInteger sumEvenNumTotal =0 ; [arrEvenNum enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL *stop) { sumEvenNumTotal += [obj integerValue]; }]; NSInteger lastNumber = [lastNum integerValue]; NSInteger luhmTotal = lastNumber + sumEvenNumTotal + sumOddNum2Total + sumOddNumTotal; return (luhmTotal%10 ==0)?YES:NO; } //判断是否为整形: + (BOOL)isPureInt:(NSString*)string { NSScanner* scan = [NSScanner scannerWithString:string]; int val; return[scan scanInt:&val] && [scan isAtEnd]; } //判断是否为浮点形: + (BOOL)isPureFloat:(NSString*)string { NSScanner* scan = [NSScanner scannerWithString:string]; float val; return[scan scanFloat:&val] && [scan isAtEnd]; } @end