New file |
| | |
| | | // |
| | | // 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<forwardNum.length; i++) |
| | | { |
| | | NSString * subStr = [forwardNum substringWithRange:NSMakeRange(i, 1)]; |
| | | [forwardArr addObject:subStr]; |
| | | } |
| | | |
| | | NSMutableArray * forwardDescArr = [[NSMutableArray alloc] initWithCapacity:0]; |
| | | for (int i = (int)(forwardArr.count-1); 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 |