// // NSString+RQExtension.m // RQCommon // // Created by 张嵘 on 2018/11/21. // Copyright © 2018 张嵘. All rights reserved. // #import "NSString+RQExtension.h" #include #define xmlRetError @"ERROR:not found " @implementation NSString (RQExtension) #pragma mark - 文本高度计算 - (CGSize)rq_sizeWithFont:(UIFont *)font { CGSize theSize; NSDictionary *attributes = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName]; theSize = [self sizeWithAttributes:attributes]; // 向上取整 theSize.width = ceil(theSize.width); theSize.height = ceil(theSize.height); return theSize; } - (CGSize)rq_sizeWithFont:(UIFont *)font limitSize:(CGSize)limitSize { CGSize theSize; NSDictionary *attributes = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName]; CGRect rect = [self boundingRectWithSize:limitSize options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil]; theSize.width = ceil(rect.size.width); theSize.height = ceil(rect.size.height); return theSize; } - (CGSize)rq_sizeWithFont:(UIFont *)font limitWidth:(CGFloat)limitWidth { return [self rq_sizeWithFont:font limitSize:CGSizeMake(limitWidth, MAXFLOAT)]; } #pragma mark - 文本内容处理 - (NSString *)rq_removeBothEndsWhitespace { return [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; } - (NSString *)rq_removeBothEndsWhitespaceAndNewline { return [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; } - (NSString *)rq_trimWhitespace { NSMutableString *str = [self mutableCopy]; CFStringTrimWhitespace((__bridge CFMutableStringRef)str); return str; } - (NSString *)rq_URLEncoding { NSString * result; if (@available(iOS 9.0, *)) { NSString *charactersToEscape = @"#[]@!$'()*+,;\"<>%{}|^~`"; NSCharacterSet *allowedCharacters = [[NSCharacterSet characterSetWithCharactersInString:charactersToEscape] invertedSet]; result = [[self description] stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters]; } else { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" //这里写出现警告的代码就能实现去除警告 result = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes( kCFAllocatorDefault, (CFStringRef)self, NULL, CFSTR("!*'();:@&=+$,/?%#[]"), kCFStringEncodingUTF8 )); #pragma clang diagnostic pop } return result; } - (NSString *)rq_URLDecoding { NSString * result; if (@available(iOS 9.0, *)) { result = [self stringByRemovingPercentEncoding]; } else { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" //这里写出现警告的代码就能实现去除警告 result = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef)self, CFSTR(""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)); #pragma clang diagnostic pop } return result; } - (NSString *)rq_trimAllWhitespace { return [self stringByReplacingOccurrencesOfString:@" " withString:@""]; } #pragma mark - 文本内容判断 + (BOOL)rq_isContainChinese:(NSString *)string { for (int i = 0; i < [string length]; i++) { int a = [string characterAtIndex:i]; if ( a > 0x4e00 && a < 0x9fff) { return YES; } } return NO; } + (BOOL)rq_isPureInt:(NSString *)string { NSScanner *scan = [NSScanner scannerWithString:string]; int val; return [scan scanInt:&val] && [scan isAtEnd]; } + (BOOL)rq_isPureFloat:(NSString *)string { NSScanner *scan = [NSScanner scannerWithString:string]; float val; return [scan scanFloat:&val] && [scan isAtEnd]; } + (BOOL)rq_isValidMobile:(NSString *)string { NSString *phoneRegex = @"^1[34578]\\d{9}$"; NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneRegex]; return [phoneTest evaluateWithObject:string]; } + (BOOL)rq_isPureDigitCharacters:(NSString *)string { string = [string stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]]; if (string.length > 0) { return NO; } return YES; } + (BOOL)rq_isValidCharacterOrNumber:(NSString *)string { // 编写正则表达式:只能是数字或英文,或两者都存在 NSString *regex = @"^[a-z0-9A-Z]*$"; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; return [predicate evaluateWithObject:string]; } + (BOOL)rq_isEmpty:(NSString *)string { if (!string) { return true; }else { NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet]; NSString *trimedString = [string stringByTrimmingCharactersInSet:set]; if ([trimedString length] == 0) { return true; }else { return false; } } } + (BOOL)rq_isValidEmail:(NSString *)string { NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; return [predicate evaluateWithObject:string]; } + (BOOL)rq_isValidQQ:(NSString *)string { NSString *regex = @"^[1-9][0-9]{4,9}$"; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; return [predicate evaluateWithObject:string]; } + (BOOL)rq_isValidURL:(NSString *)url { if(url.length < 1) return NO; if (url.length>4 && [[url substringToIndex:4] isEqualToString:@"www."]) { url = [NSString stringWithFormat:@"http://%@",url]; } else { url = url; } NSString *urlRegex = @"(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]"; NSPredicate* urlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", urlRegex]; return [urlTest evaluateWithObject:url]; } #pragma mark - Other -(NSString* )getXlmRet { NSMutableString* mstr = [NSMutableString stringWithString:self]; NSRange substr = [mstr rangeOfString:@""]; NSRange substr2 = [mstr rangeOfString:@""]; if (substr.location == NSNotFound || substr2.location == NSNotFound) { return xmlRetError; } NSString *result = [mstr substringWithRange:NSMakeRange(substr.location + substr.length, substr2.location - substr.location - substr.length)]; return result; } -(NSString*)getCode{ if (![self getXlmRet]) { return nil; } NSDictionary* root = [self jsonObject]; return root[@"code"]; } -(id)jsonObject { NSString* ret = [self getXlmRet]; if (!ret) { return nil; } //options --dansonpro NSData* jsonData = [ret dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary* json = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil]; return json; } - (NSString *)md5Encrypt { const char *cStr = [self UTF8String]; unsigned char result[16]; CC_MD5( cStr, (unsigned int)strlen(cStr), result ); NSString* str = [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7], result[8], result[9], result[10], result[11], result[12], result[13], result[14], result[15] ]; str = [self toLower:str]; return str; } -(NSString *)toLower:(NSString *)str { for (NSInteger i=0; i='A'&[str characterAtIndex:i]<='Z') { //A对应ASCII码的65 a对应ASCII码的97 //大写换小写 ASCII编码 --Danson char temp=[str characterAtIndex:i]+32; NSRange range=NSMakeRange(i, 1); str=[str stringByReplacingCharactersInRange:range withString:[NSString stringWithFormat:@"%c",temp]]; } } return str; } -(NSString *)toHighterWithLower:(NSString *)str { for (NSInteger i=0; i='a'&[str characterAtIndex:i]<='z') { //A对应ASCII码的65 a对应ASCII码的97 //小写换大写 ASCII编码 --Danson char temp=[str characterAtIndex:i]-32; NSRange range=NSMakeRange(i, 1); str=[str stringByReplacingCharactersInRange:range withString:[NSString stringWithFormat:@"%c",temp]]; } } return str; } -(CGFloat)heightForWid:(CGFloat)wid Font:(CGFloat)fontSize { if (self.length < 1) { return 20.0; } return [self boundingRectWithSize:CGSizeMake(wid, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName: [UIFont rq_fontForPingFangSC_RegularFontOfSize:fontSize]} context:nil].size.height; } -(CGSize)sizeForFont:(CGFloat)fontSize { if (self.length < 1) { return CGSizeMake(20, 20); } return [self boundingRectWithSize:CGSizeMake(MAXFLOAT, 20) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:fontSize]} context:nil].size; } -(NSString*)base64 { NSString* path = [[NSBundle mainBundle] pathForResource:self ofType:nil]; UIImage *_originImage = [UIImage imageNamed:path]; NSData *_data = UIImagePNGRepresentation(_originImage); NSString *_encodedImageStr = [_data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; return _encodedImageStr; } /** Base64字符串转UIImage图片:、 //UIImage图片转成Base64字符串: UIImage *originImage = [UIImage imageNamed:@"originImage.png"]; NSData *data = UIImageJPEGRepresentation(originImage, 1.0f); NSString *encodedImageStr = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; //Base64字符串转UIImage图片: NSData *decodedImageData = [[NSData alloc] initWithBase64EncodedString:encodedImageStr options:NSDataBase64DecodingIgnoreUnknownCharacters]; UIImage *decodedImage = [UIImage imageWithData:decodedImageData]; */ /// 传入 秒 得到 xx:xx:xx /// @param totalTime 秒数 + (NSString *)getMMSSFromSS:(NSString *)totalTime { NSInteger seconds = [totalTime integerValue]; //format of hour NSString *str_hour = [NSString stringWithFormat:@"%02ld",seconds/3600]; //format of minute NSString *str_minute = [NSString stringWithFormat:@"%02ld",(seconds%3600)/60]; //format of second NSString *str_second = [NSString stringWithFormat:@"%02ld",seconds%60]; //format of time NSString *format_time = [NSString stringWithFormat:@"%@:%@:%@",str_hour,str_minute,str_second]; return format_time; } - (NSString *)getPinYin { NSMutableString *pinyin = [[NSMutableString alloc] initWithString:self]; CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformMandarinLatin, NO); CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformStripCombiningMarks, NO); return pinyin.copy; } @end @implementation NSDictionary (Log) - (NSString *)descriptionWithLocale:(id)locale { NSMutableString *str = [NSMutableString string]; [str appendString:@"{\n"]; //遍历字典的所有键值对 [self enumerateKeysAndObjectsUsingBlock:^(id key,id obj, BOOL *stop) { if (!key) { key = @""; } if (!obj) { obj = @""; } [str appendFormat:@"\t%@ = %@,\n", key, obj]; }]; [str appendString:@"}"]; //查出最后一个,的范围 NSRange range = [str rangeOfString:@","options:NSBackwardsSearch]; if (range.length) { // 删掉最后一个, [str deleteCharactersInRange:range]; } return str; } @end @implementation NSArray (Log) - (NSString *)descriptionWithLocale:(id)locale { NSMutableString *str = [NSMutableString string]; [str appendString:@"[\n"]; //遍历数组的所有元素 [self enumerateObjectsUsingBlock:^(id obj,NSUInteger idx, BOOL *stop) { [str appendFormat:@"%@,\n", obj]; }]; [str appendString:@"]"]; //查出最后一个,的范围 NSRange range = [str rangeOfString:@","options:NSBackwardsSearch]; if (range.length) { // 删掉最后一个, [str deleteCharactersInRange:range]; } return str; } @end