//
|
// 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;
|
}
|
|
|
@end
|