Files
peko-ios/YuMi/Tools/NSString/NSString+Utils.m
2024-09-23 20:35:29 +08:00

330 lines
14 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// NSString+Regex.m
// YUMI
//
// Created by YUMI on 2021/9/14.
//
#import "NSString+Utils.h"
#import <CommonCrypto/CommonDigest.h>
#import "LoginAreaModel.h"
@implementation NSString (Utils)
///是否是正确的手机号
- (BOOL)isPhoneNumber{
NSString *regex =@"^((1[3-9][0-9])|(147)|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [pred evaluateWithObject:self];
}
///MD5加密
- (NSString *)MD5String {
const char *cstr = [self UTF8String];
unsigned char result[16];
CC_MD5(cstr, (CC_LONG)strlen(cstr), result);
return [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]
];
}
+ (BOOL)versionCompareOldStr:(NSString *)first andNewStr: (NSString *)second{
if ([first compare:second options:NSNumericSearch] == NSOrderedAscending){
return NO;
}else if ([first compare:second options:NSNumericSearch] == NSOrderedSame){
return YES;
}else{
return YES;
}
}
+(NSString *)getDealTenNumWithString:(NSString *)string{
if (string.floatValue < 100000) {
return [NSString stringWithFormat:@"%@", string];
}
NSDecimalNumber *numberA = [NSDecimalNumber decimalNumberWithString:string];
NSDecimalNumber *numberB = [NSDecimalNumber decimalNumberWithString:@"1000"];
//NSDecimalNumberBehaviors对象的创建 参数 1.RoundingMode 一个取舍枚举值 2.scale 处理范围 3.raiseOnExactness 精确出现异常是否抛出原因 4.raiseOnOverflow 上溢出是否抛出原因 4.raiseOnUnderflow 下溢出是否抛出原因 5.raiseOnDivideByZero 除以0是否抛出原因。
NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:0 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
/// 这里不仅包含Multiply还有加 减 乘。
NSDecimalNumber *numResult = [numberA decimalNumberByDividingBy:numberB withBehavior:roundingBehavior];
NSString *strResult = [numResult stringValue];
return [NSString stringWithFormat:@"%@k", strResult];
}
///数字转化为万
+ (NSString *)getDealNumWithString:(NSString *)string{
if (string.floatValue < 10000) {
return [NSString stringWithFormat:@"%@", string];
}
NSDecimalNumber *numberA = [NSDecimalNumber decimalNumberWithString:string];
NSDecimalNumber *numberB = [NSDecimalNumber decimalNumberWithString:@"10000"];
//NSDecimalNumberBehaviors对象的创建 参数 1.RoundingMode 一个取舍枚举值 2.scale 处理范围 3.raiseOnExactness 精确出现异常是否抛出原因 4.raiseOnOverflow 上溢出是否抛出原因 4.raiseOnUnderflow 下溢出是否抛出原因 5.raiseOnDivideByZero 除以0是否抛出原因。
NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
/// 这里不仅包含Multiply还有加 减 乘。
NSDecimalNumber *numResult = [numberA decimalNumberByDividingBy:numberB withBehavior:roundingBehavior];
NSString *strResult = [numResult stringValue];
return [NSString stringWithFormat:YMLocalizedString(@"NSString_Utils4"), strResult];
}
+ (NSString *)formatNumberToKOrM:(NSString *)string {
// 定义数值单位
NSDecimalNumber *thousand = [NSDecimalNumber decimalNumberWithString:@"1000"];
NSDecimalNumber *nine = [NSDecimalNumber decimalNumberWithString:@"9999"];
NSDecimalNumber *million = [NSDecimalNumber decimalNumberWithString:@"1000000"];
NSDecimalNumber *billion = [NSDecimalNumber decimalNumberWithString:@"1000000000"];
NSDecimalNumber *trillion = [NSDecimalNumber decimalNumberWithString:@"1000000000000"];
// 创建 NSDecimalNumber 对象
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:string];
// 判断数值范围并处理
if ([number compare:nine] == NSOrderedAscending) {
// 小于 10000直接返回原始值
return [NSString stringWithFormat:@"%@", string];
} else if ([number compare:nine] != NSOrderedAscending && [number compare:million] == NSOrderedAscending) {
// 10000 到 9999999用K表示
NSDecimalNumber *result = [number decimalNumberByDividingBy:thousand];
return [self formatResult:result withUnit:@"K"];//[NSString stringWithFormat:@"%.1fK", result.doubleValue];
} else if ([number compare:million] != NSOrderedAscending && [number compare:billion] == NSOrderedAscending) {
// 超过 1000000用M表示
NSDecimalNumber *result = [number decimalNumberByDividingBy:million];
return [self formatResult:result withUnit:@"M"];//[NSString stringWithFormat:@"%.1fM", result.doubleValue];
} else if ([number compare:billion] != NSOrderedAscending && [number compare:trillion] == NSOrderedAscending) {
// 超过十亿,用 B 表示
NSDecimalNumber *result = [number decimalNumberByDividingBy:billion];
return [self formatResult:result withUnit:@"B"];
} else {
// 超过一万亿,可以继续增加更高单位
NSDecimalNumber *result = [number decimalNumberByDividingBy:trillion];
return [self formatResult:result withUnit:@"T"]; // T 表示万亿 (Trillion)
}
}
+ (NSString *)formatResult:(NSDecimalNumber *)result withUnit:(NSString *)unit {
// 将 NSDecimalNumber 转为浮点数
CGFloat floatValue = result.floatValue;
// 格式化字符串,保留两位小数
NSString *formattedString = [NSString stringWithFormat:@"%.2f", floatValue];
// 移除多余的 .00 或 .0
if ([formattedString hasSuffix:@".00"]) {
formattedString = [formattedString substringToIndex:formattedString.length - 3]; // 移除 ".00"
} else if ([formattedString hasSuffix:@".0"]) {
formattedString = [formattedString substringToIndex:formattedString.length - 2]; // 移除 ".0"
}
return [NSString stringWithFormat:@"%@%@", formattedString, unit];
}
+ (NSString *)stringWithTimeStamp:(NSString *)timeStamp {
// 转为秒为单位
NSTimeInterval second = timeStamp.longLongValue / 1000;
NSDate *date = [NSDate dateWithTimeIntervalSince1970:second];
//把字符串转为NSdate
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
// 时间 10点10分
NSDateFormatter *timeFormatter = [[NSDateFormatter alloc] init];
[timeFormatter setDateFormat:@"HH:mm"];
// 日期 2月18号
NSDateFormatter *dayFormatter = [[NSDateFormatter alloc] init];
[dayFormatter setDateFormat:YMLocalizedString(@"NSString_Utils0")];
// 日期 年月日
NSDateFormatter *yearFormatter = [[NSDateFormatter alloc] init];
[yearFormatter setDateFormat:YMLocalizedString(@"NSString_Utils1")];
//得到与当前时间差
NSTimeInterval timeInterval = [date timeIntervalSinceNow];
timeInterval = -timeInterval;
long temp = 0;
NSString *result;
BOOL isSameDay = [[NSCalendar currentCalendar] isDateInToday:date]; // 是否是同一天
// A. 当天,且 timeInterval < 1分钟显示“刚刚”
if (timeInterval < 60) {
return [NSString stringWithFormat:@"%@", YMLocalizedString(@"NSString_Utils2")];
// B. 当天且1分钟≤ timeInterval <60分钟显示“n分钟前”
} else if((temp = timeInterval/60) < 60){
return [NSString stringWithFormat:YMLocalizedString(@"NSString_Utils3"),temp];
// C. 当天且n≥60分钟显示“xx:xx”
} else if((temp = temp/60) < 24 && isSameDay){
return [timeFormatter stringFromDate:date];
// C. 非当天且n≥60分钟显示“xx:xx”
} else if((temp = temp/60) < 24 && !isSameDay){
return [dayFormatter stringFromDate:date];
// D. 跨天且未跨年显示“mm-dd”
} else if((temp = temp/30) < 30){
return [dayFormatter stringFromDate:date];
} else {
// E. 跨年显示“yyyy-mm-dd”
return [yearFormatter stringFromDate:date];
}
return result;
}
+ (NSString *)calculateConstellationWithMonth:(long)time
{
NSString *astroString = YMLocalizedString(@"XPMineHeadView0");
NSString *astroFormat = @"102123444543";
NSString *result;
NSInteger month = [NSString getMonth:time];
NSInteger day = [NSString getDay:time];
if (month<1 || month>12 || day<1 || day>31){
return YMLocalizedString(@"XPMineHeadView1");
}
if(month==2 && day>29)
{
return YMLocalizedString(@"XPMineHeadView2");
}else if(month==4 || month==6 || month==9 || month==11) {
if (day>30) {
return YMLocalizedString(@"XPMineHeadView3");
}
}
result=[NSString stringWithFormat:@"%@",[astroString substringWithRange:NSMakeRange(month*2-(day < [[astroFormat substringWithRange:NSMakeRange((month-1), 1)] intValue] - (-19))*2,2)]];
return [NSString stringWithFormat:YMLocalizedString(@"XPMineHeadView6"),result];
}
///通过生日获取星座图片
+ (NSString *)getCalculateConstellationImageWithMonth:(long)time{
NSString *astroString = YMLocalizedString(@"XPMineHeadView0");
NSString *astroFormat = @"102123444543";
NSString *result;
NSInteger month = [self getMonth:time];
NSInteger day = [self getDay:time];
if (month<1 || month>12 || day<1 || day>31){
return @"";
}
if(month==2 && day>29)
{
return @"";
}else if(month==4 || month==6 || month==9 || month==11) {
if (day>30) {
return @"";
}
}
result=[NSString stringWithFormat:@"%@",[astroString substringWithRange:NSMakeRange(month*2-(day < [[astroFormat substringWithRange:NSMakeRange((month-1), 1)] intValue] - (-19))*2,2)]];
NSDictionary *starDic = @{YMLocalizedString(@"XPMineHeadView9"):@"pi_capricorn",YMLocalizedString(@"XPMineHeadView10"):@"pi_water_bottle",YMLocalizedString(@"XPMineHeadView11"):@"pi_pisces",YMLocalizedString(@"XPMineHeadView12"):@"pi_aries",YMLocalizedString(@"XPMineHeadView13"):@"pi_taurus",YMLocalizedString(@"XPMineHeadView14"):@"pi_gemini",YMLocalizedString(@"XPMineHeadView15"):@"pi_cancer",YMLocalizedString(@"XPMineHeadView16"):@"pi_lion",YMLocalizedString(@"XPMineHeadView17"):@"pi_virgin",YMLocalizedString(@"XPMineHeadView18"):@"pi_libra",YMLocalizedString(@"XPMineHeadView19"):@"pi_scorpion",YMLocalizedString(@"XPMineHeadView20"):@"pi_shooter"};
return starDic[result];
}
///通过生日获取星座
+ (NSString *)getCalculateConstellationTextWithMonth:(long)time{
NSString *astroString = YMLocalizedString(@"XPMineHeadView0");
NSString *astroFormat = @"102123444543";
NSString *result;
NSInteger month = [self getMonth:time];
NSInteger day = [self getDay:time];
if (month<1 || month>12 || day<1 || day>31){
return @"";
}
if(month==2 && day>29)
{
return @"";
}else if(month==4 || month==6 || month==9 || month==11) {
if (day>30) {
return @"";
}
}
result=[NSString stringWithFormat:@"%@",[astroString substringWithRange:NSMakeRange(month*2-(day < [[astroFormat substringWithRange:NSMakeRange((month-1), 1)] intValue] - (-19))*2,2)]];
return result;
}
+(NSInteger) getMonth:(long )time
{
NSDate *date = [NSDate dateWithTimeIntervalSince1970:time/1000];
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [calendar components:NSCalendarUnitMonth fromDate:date];
NSInteger month = components.month;
return month;
}
+ (NSInteger) getDay:(long) time
{
NSDate *date = [NSDate dateWithTimeIntervalSince1970:time/1000];
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [calendar components:NSCalendarUnitDay fromDate:date];
NSInteger day = components.day;
return day;
}
+(NSString *)getAgeWithBirth:(long)birth{
NSDateComponents *components1 = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate dateWithTimeIntervalSince1970:birth/1000]];
NSInteger brithDateYear = [components1 year];
NSInteger brithDateDay = [components1 day];
NSInteger brithDateMonth = [components1 month];
// 获取系统当前 年月日
NSDateComponents *components2 = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]]; NSInteger currentDateYear = [components2 year];
NSInteger currentDateDay = [components2 day]; NSInteger currentDateMonth = [components2 month]; // 计算年龄
NSInteger iAge = currentDateYear - brithDateYear - 1;
if ((currentDateMonth > brithDateMonth) || (currentDateMonth == brithDateMonth && currentDateDay >= brithDateDay)) {
iAge++;
}
return @(iAge).stringValue;
}
///得到区号
+(NSString *)getCountryCode{
// 获取文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"pi_area_info" ofType:@"json"];
// 将文件数据化
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
// 对数据进行JSON格式化并返回字典形式
NSDictionary *codeData = [NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingMutableLeaves
error:nil];
NSArray *codeList = [LoginAreaModel modelsWithArray:codeData[@"RECORDS"]];
NSString *mccCode = [YYUtility getMobileCountryCode];
NSString *countryCode = @"";
if([mccCode isEqualToString:@"65535"]) {
return @"+886";
}
for (LoginAreaModel *obj in codeList) {
if([mccCode isEqualToString:obj.mcc]){
countryCode = obj.code;
break;
}
}
if(countryCode.length == 0) {
return @"+886";
}
return [NSString stringWithFormat:@"+%@",countryCode];
}
+(NSString *)createUUID{
CFUUIDRef uuid;
CFStringRef uuidText;
uuid = CFUUIDCreate(NULL);
uuidText = CFUUIDCreateString(NULL, uuid);
NSString *time = [NSDate getNowTimeTimestamp];
NSString *result = [NSString stringWithFormat:@"%@%@",uuidText,time];
return [result MD5String];
}
@end