// // Created by Yaotian on 12/11/13. // Copyright (c) 2013 Kollway Mobile. All rights reserved. // #import "KWMStringUtil.h" #import <CommonCrypto/CommonDigest.h> #import <SAMCategories/NSString+SAMAdditions.h> #import "KWMUserDao.h" static NSDateFormatter *yearMonthDayFormatter; static NSDateFormatter *monthDayFormatter; @implementation KWMStringUtil + (void)initialize { [super initialize]; yearMonthDayFormatter = [[NSDateFormatter alloc] init]; [yearMonthDayFormatter setDateFormat:@"yyyy-MM-dd"]; monthDayFormatter = [[NSDateFormatter alloc] init]; [monthDayFormatter setDateFormat:@"MM-dd"]; } + (NSString *)MD5:(NSString *)input { if(!input){ return input; } return [input sam_MD5Digest]; } + (NSString *)BASE64:(NSString *)input { if(!input){ return input; } return [input sam_base64EncodedString]; } + (BOOL)isEmpty:(NSString *)input { return [input isKindOfClass:[NSNull class]] || input == nil || [input length] <= 0; } + (BOOL)isBlank:(NSString *)input { return [self isEmpty:input] || ([[input stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length]==0); } + (BOOL)isNumberString:(NSString *)input { if([input isKindOfClass:[NSNull class]]){ return NO; } if([KWMStringUtil isBlank:input]){ return NO; } NSInteger len = input.length; for(int i = 0; i < len; i++){ unichar c = [input characterAtIndex:i]; if(!isnumber(c)){ return NO; } } return YES; } + (BOOL)isPhone:(NSString *)input { if([input isKindOfClass:[NSNull class]]){ return NO; } if(! [KWMStringUtil isNumberString:input]){ return NO; } NSInteger len = [input length]; if(len != 11){ return NO; } for(int i = 0; i < len; i++){ unichar c = [input characterAtIndex:i]; if(! isdigit(c)){ return NO; } } return YES; } + (NSString *)readableDateString:(NSDate *)date { static NSString *f = @"MM/dd"; NSString *result = [KWMStringUtil dateToString:date format:f]; if ([result isEqualToString:[KWMStringUtil dateToString:[NSDate date] format:f]]) { return @"今天"; } return result; } + (NSString *)readableTimeString:(NSDate *)date { NSCalendarUnit dateFlags = NSCalendarUnitYear| NSCalendarUnitMonth| NSCalendarUnitDay| NSCalendarUnitHour| NSCalendarUnitMinute| NSCalendarUnitSecond; NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *dateComponents = [gregorianCalendar components:dateFlags fromDate:date]; NSDateComponents *nowComponents = [gregorianCalendar components:dateFlags fromDate:[NSDate new]]; if((dateComponents.year < nowComponents.year)|| (dateComponents.month < nowComponents.month)|| (dateComponents.day < nowComponents.day)){ return [KWMStringUtil yearMonthDateString:date]; } NSInteger hourSub = nowComponents.hour - dateComponents.hour; if(hourSub > 0){ return [[NSString alloc] initWithFormat:@"%@小时前", @(hourSub)]; } NSInteger minuteSub = nowComponents.minute - dateComponents.minute; if(minuteSub > 0){ return [[NSString alloc] initWithFormat:@"%@分钟前", @(minuteSub)]; } NSInteger secondSub = nowComponents.second - dateComponents.second; if(secondSub > 5){ return [[NSString alloc] initWithFormat:@"%@秒前", @(secondSub)]; }else{ return [[NSString alloc] initWithFormat:@"刚刚"]; } } +(NSString *)dateFormatTimeString:(long long)time{ //去除毫秒 NSString *timeStr = [NSString stringWithFormat:@"%lld",time]; if ([timeStr length] == 13) { time = time/1000; } //设置时间 NSDateFormatter* formatter = [[NSDateFormatter alloc] init]; [formatter setDateStyle:NSDateFormatterMediumStyle]; [formatter setTimeStyle:NSDateFormatterShortStyle]; [formatter setDateFormat:@"yyyy-MM-dd"]; NSDate *addTimesp = [NSDate dateWithTimeIntervalSince1970:time]; return [KWMStringUtil readableTimeString:addTimesp]; } + (NSString *)yearMonthDateString:(NSDate *)date { return [yearMonthDayFormatter stringFromDate:date]; } + (NSString *)dateToString:(NSDate *)date format:(NSString *)formatStr { NSDateFormatter *f = [[NSDateFormatter alloc] init]; [f setDateFormat:formatStr]; return [f stringFromDate:date]; } + (NSDate *)stringToDate:(NSString *)dateStr format:(NSString *)formatStr { NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; NSTimeZone *timeZone = [NSTimeZone localTimeZone]; [formatter setTimeZone:timeZone]; [formatter setDateFormat:formatStr]; return [formatter dateFromString:dateStr]; } + (NSString *)monthDateString:(NSDate *)date { return [monthDayFormatter stringFromDate:date]; } //获取时间是星期几 +(NSString *)dateformatToWeek:(long long)time{ NSArray * arrWeek=[NSArray arrayWithObjects:@"周日",@"周一",@"周二",@"周三",@"周四",@"周五",@"周六", nil]; //去除毫秒 NSString *timeStr = [NSString stringWithFormat:@"%lld",time]; if ([timeStr length] == 13) { time = time/1000; } NSDate *date = [NSDate dateWithTimeIntervalSince1970:time]; NSCalendarUnit dateFlags = NSCalendarUnitWeekday; NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *dateComponents = [gregorianCalendar components:dateFlags fromDate:date]; NSInteger week = [dateComponents weekday]; return [arrWeek objectAtIndex:week-1]; } +(NSString *) dateformatToYear:(long long) time{ //去除毫秒 NSString *timeStr = [NSString stringWithFormat:@"%lld",time]; if ([timeStr length] == 13) { time = time/1000; } //设置时间 NSDateFormatter* formatter = [[NSDateFormatter alloc] init]; [formatter setDateStyle:NSDateFormatterMediumStyle]; [formatter setTimeStyle:NSDateFormatterShortStyle]; [formatter setDateFormat:@"yyyy-MM-dd"]; NSDate *addTimesp = [NSDate dateWithTimeIntervalSince1970:time]; NSString *addTimespStr = [formatter stringFromDate:addTimesp]; return addTimespStr; } +(NSString *) dateformatToHours:(long long) time{ //去除毫秒 NSString *timeStr = [NSString stringWithFormat:@"%lld",time]; if ([timeStr length] == 13) { time = time/1000; } //设置时间 NSDateFormatter* formatter = [[NSDateFormatter alloc] init]; [formatter setDateStyle:NSDateFormatterMediumStyle]; [formatter setTimeStyle:NSDateFormatterShortStyle]; [formatter setDateFormat:@"HH:mm"]; NSDate *addTimesp = [NSDate dateWithTimeIntervalSince1970:time]; NSString *addTimespStr = [formatter stringFromDate:addTimesp]; return addTimespStr; } + (NSString *)getFileName:(NSString *)filePath { if([self isEmpty:filePath]){ return @""; } return [filePath lastPathComponent]; } + (NSString *) trimPhoneNumber:(NSString *)string { NSCharacterSet * invalidNumberSet = [NSCharacterSet characterSetWithCharactersInString:@" -\n_!@#$%^&*()[]{}'\".,<>:;|\\/?+=\t~` "]; NSString * result = @""; NSScanner * scanner = [NSScanner scannerWithString:string]; NSString * scannerResult; [scanner setCharactersToBeSkipped:nil]; while (![scanner isAtEnd]) { if([scanner scanUpToCharactersFromSet:invalidNumberSet intoString:&scannerResult]) { result = [result stringByAppendingString:scannerResult]; } else { if(![scanner isAtEnd]) { [scanner setScanLocation:[scanner scanLocation]+1]; } } } return result; } + (NSString *)flattenHTML:(NSString *)html { if([self isEmpty:html]){ return html; } NSScanner *theScanner; NSString *text = nil; theScanner = [NSScanner scannerWithString:html]; while (! [theScanner isAtEnd]) { // find start of tag [theScanner scanUpToString:@"<" intoString:NULL] ; // find end of tag [theScanner scanUpToString:@">" intoString:&text] ; // replace the found tag with a space //(you can filter multi-spaces out later if you wish) html = [html stringByReplacingOccurrencesOfString: [ NSString stringWithFormat:@"%@>", text] withString:@""]; } return [html stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; } + (NSString *)getPureText:(NSString *)input { if([self isEmpty:input]){ return input; } input = [input stringByReplacingOccurrencesOfString:@" " withString:@""]; input = [input stringByReplacingOccurrencesOfString:@"\n" withString:@""]; input = [input stringByReplacingOccurrencesOfString:@"\t" withString:@""]; input = [input stringByReplacingOccurrencesOfString:@"\b" withString:@""]; input = [input stringByReplacingOccurrencesOfString:@"\r" withString:@""]; input = [input stringByReplacingOccurrencesOfString:@"\f" withString:@""]; return input; } + (NSString *)getShortText:(NSString *)text maxLen:(int)maxLen{ if([KWMStringUtil isEmpty:text]){ return text; } if(text.length > maxLen){ NSString *moreStr = @"…"; text = [text substringWithRange:NSMakeRange(0, (NSUInteger) (maxLen - moreStr.length))]; text = [text stringByAppendingString:moreStr]; } return text; } + (NSString *)urlencode:(NSString *)input { NSMutableString *output = [NSMutableString string]; const unsigned char *source = (const unsigned char *)[input UTF8String]; NSInteger sourceLen = strlen((const char *)source); for (int i = 0; i < sourceLen; ++i) { const unsigned char thisChar = source[i]; if (thisChar == ' '){ [output appendString:@"+"]; } else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' || (thisChar >= 'a' && thisChar <= 'z') || (thisChar >= 'A' && thisChar <= 'Z') || (thisChar >= '0' && thisChar <= '9')) { [output appendFormat:@"%c", thisChar]; } else { [output appendFormat:@"%%%02X", thisChar]; } } return output; } + (NSString *)fitImageWidthHtmlContent:(NSString *)htmlContent maxWidth:(NSInteger)width{ NSString *preHtml = [[NSString alloc] initWithFormat:@"<!DOCTYPE HTML><html><head><script type=\"text/javascript\">function ResizeImages(myimg){var maxWidth = %d; var oldWidth; var oldwidth,oldHeight;var i;myimg.style.cssText=\"\"; if(myimg.width > maxWidth){oldWidth = myimg.width; oldHeight = myimg.height; myimg.width = maxWidth; myimg.height = oldHeight*(maxWidth/oldWidth);}}</script><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no\"><style>* {font-family: Arial,Helvetica,\"Nimbus Sans L\",sans-serif;-webkit-text-size-adjust: none;}div.container img{padding-bottom:10px;}</style></head><body style=\"-moz-user-select: none;-webkit-user-select: none;width:%dpx;px;margin-left:10px;padding: 0px;margin-right:10px\">", width, width]; NSString *afterHtml = @"</body></html>"; htmlContent = [htmlContent stringByReplacingOccurrencesOfString:@"<img" withString:@"<img onload=\"ResizeImages(this);\""]; htmlContent = [NSString stringWithFormat:@"%@%@%@", preHtml, htmlContent, afterHtml]; return htmlContent; } + (BOOL)isMobileNumber:(NSString *)mobileNum { static NSString *TRUE_PHONE = @"^((13[0-9])|(15[^4,\\D])|(18[0-9]))\\d{8}$"; NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", TRUE_PHONE]; return [regextestmobile evaluateWithObject:mobileNum]; } + (NSString * _Nonnull)nonNullString:(NSString * _Nullable)input { if (input != nil) { if ([input isKindOfClass:[NSString class]]) { return input; } } return @""; } //去掉string的左右的空格 +(NSString *)deleteBlankForString:(NSString *)text{ NSString *textString = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; return textString; } // 计算内容的高度 +(CGSize)boundingRectWithSize:(CGSize)size text:(NSString *)text testSize:(CGFloat) testSize{ UIFont *font = [UIFont systemFontOfSize:testSize]; NSDictionary *attribute = @{NSFontAttributeName:font}; CGSize retSize = [text boundingRectWithSize:CGSizeMake(size.width , MAXFLOAT) options: NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attribute context:nil].size; return retSize; } //计算内容的宽度 +(CGSize)getLabelWidth:(NSString *)text labelFont:(UIFont *)aLabelFont textHeight:(CGFloat) textHeight{ CGSize constraint = CGSizeMake(MAXFLOAT, textHeight); CGRect rect = [text boundingRectWithSize:constraint options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{ NSFontAttributeName : aLabelFont } context:nil]; return rect.size; } //计算文本内容的高度 +(CGSize)getLabelHeight:(NSString *)text labelFont:(UIFont *)aLabelFont textWidth:(CGFloat) textWidth{ CGSize constraint = CGSizeMake(textWidth, MAXFLOAT); CGRect rect = [text boundingRectWithSize:constraint options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{ NSFontAttributeName : aLabelFont } context:nil]; return rect.size; } //删除出字母以及“-”以外的字符补充为@"-" static NSString *kEnglishNum = @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-"; + (NSString *)deleteOtherCharExceptLetterWithLine:(NSString *)str{ NSString *changeStr = [str stringByReplacingOccurrencesOfString:@"é" withString:@"e"]; changeStr = [changeStr stringByReplacingOccurrencesOfString:@"è" withString:@"e"]; changeStr = [changeStr stringByReplacingOccurrencesOfString:@"'" withString:@""]; NSMutableString *newStr = [NSMutableString stringWithFormat:@"%@",[self changeString:changeStr]]; NSMutableString *tempStr = newStr; BOOL isHas = NO; for (int i = 0; i < newStr.length; ++i) { unichar aChar = [newStr characterAtIndex:i]; NSString *aStr = [NSString stringWithFormat:@"%c",aChar]; if ([aStr isEqualToString:@"-"]) { if (isHas) { [tempStr deleteCharactersInRange:NSMakeRange(i, 1)]; }else{ isHas = YES; } }else{ isHas = NO; } } return newStr; } + (NSString *)changeString:(NSString *)str{ NSString *newStr = [NSString stringWithFormat:@"%@", str]; NSInteger markP = -1; for (int i = 0; i < str.length; ++i) { unichar aChar = [str characterAtIndex:i]; NSString *aStr = [NSString stringWithFormat:@"%c",aChar]; if (![kEnglishNum containsString:aStr]) { if (markP == -1) { newStr = [newStr stringByReplacingOccurrencesOfString:aStr withString:@"-"]; markP = i; }else{ newStr = [newStr stringByReplacingOccurrencesOfString:aStr withString:@""]; } } } return newStr; } +(NSNumber *)stringToNumber:(NSString *)numberString{ if([self isEmpty:numberString]){ return [NSNumber numberWithInteger:0]; } id result; NSNumberFormatter *f = [[NSNumberFormatter alloc] init]; if ([f numberFromString:numberString]) { result=[NSNumber numberWithFloat:[numberString floatValue]]; } else { return [NSNumber numberWithInteger:0]; } return result; } //中文转拼音 + (NSString *)transform:(NSString *)chinese{ NSMutableString *pinyin = [NSMutableString stringWithString:chinese]; CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformMandarinLatin, NO);//带音标 CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformStripDiacritics, NO);//去掉音标 // return [pinyin uppercaseString]; return pinyin; } //¥ + (NSString *)getEUR2CNYstring:(NSNumber *)price{ NSString *CNYstring = @" "; if(price == nil){ return CNYstring; } float exchageRate = [[KWMUserDao shareDao] exchangeRate].floatValue; // if(exchageRate == 0){ // exchageRate = ExchangeRate; // } CNYstring = [NSString stringWithFormat:@"%.2f",price.floatValue * exchageRate]; // CNYstring = [NSString stringWithFormat:@"%.2f",price.floatValue]; return CNYstring; } + (NSString *)price:(NSNumber *)price{ NSString *CNYstring = [self getEUR2CNYstring:price]; return [NSString stringWithFormat:@"CN¥%@",CNYstring]; } + (NSArray *)splitArray:(NSArray *)array withSubSize:(NSInteger)subSize{ //拆分后的数组个数 NSInteger count = array.count % subSize == 0?(array.count /subSize): (array.count / subSize + 1); NSMutableArray *arr = [NSMutableArray array]; for (int i = 0; i < count; i ++) { //数组下标 NSInteger index = i * subSize; //保存拆分的固定长度的数组元素的可变数组 NSMutableArray *arr1 = [[NSMutableArray alloc] init]; //移除子数组的所有元素 [arr1 removeAllObjects]; NSInteger j = index; //将数组下标乘以1、2、3,得到拆分时数组的最大下标值,但最大不能超过数组的总大小 while (j < subSize*(i + 1) && j < array.count) { [arr1 addObject:[array objectAtIndex:j]]; j += 1; } //将子数组添加到保存子数组的数组中 [arr addObject:[arr1 copy]]; } return [arr copy]; } @end