iOS 系统自带格式化方式总结(NSFormatter)

有时我们需要根据需求格式化数据,如:日期,数字。有时我们可能不知道系统已经提供了格式化的方式。还要自己写代码进行处理。本文就是对系统提供的各种格式化的方式进行总结。

一.数字和数量单位的格式化

数字格式化系统提供了NSNumberFormatter进行处理
以下是系统自带的几种格式:

风格 对应的枚举 输出样式(12345.678)
四舍五入的整数 NSNumberFormatterNoStyle 12346
小数形式 NSNumberFormatterDecimalStyle 12,345.678
货币形式(已本地化处理) NSNumberFormatterCurrencyStyle $12,345.68
百分数形式 NSNumberFormatterPercentStyle 1,234,568%
科学计数 NSNumberFormatterScientificStyle 1.2345678E4
朗读形式 NSNumberFormatterSpellOutStyle twelve thousand three hundred forty-five point six seven eight
序数形式 NSNumberFormatterOrdinalStyle 12,346th
货币形式(已本地化处理) NSNumberFormatterCurrencyISOCodeStyle USD12,345.68
货币形式(已本地化处理) NSNumberFormatterCurrencyPluralStyle 12,345.68 US dollars
会计计数 NSNumberFormatterCurrencyAccountingStyle $12,345.68

另外我们也可以根据需求自定义格式:
1.直接用setPositiveFormat的设置样式

NSNumberFormatter *numberFormatter = [NSNumberFormatter new];
numberFormatter.numberStyle = NSNumberFormatterDecimalStyle;
//如果不用.00的样式整数格式化后不会保留小数
[numberFormatter setPositiveFormat:@"#,###.00元"];
NSString *theAmount = [formatter stringFromNumber:[NSNumber numberWithDouble:[@"12345.999" doubleValue]]];

2.使用系统提供的不同的属性设置

    // 小数点样式
    numberFormatter.decimalSeparator = @".";
    
    // 零的样式
    numberFormatter.zeroSymbol       = @"-";
    
    // 正前缀和后缀
    numberFormatter.positivePrefix = @"!";
    numberFormatter.positiveSuffix = @"元";
    // 负前缀和后缀
    numberFormatter.negativePrefix = @"@";
    numberFormatter.negativeSuffix = @"钱";
    // 整数最多位数
    numberFormatter.maximumIntegerDigits = 10;
    
    // 整数最少位数
    numberFormatter.minimumIntegerDigits = 2;
    
    // 小数位最多位数
    numberFormatter.maximumFractionDigits = 3;
    
    // 小数位最少位数
    numberFormatter.minimumFractionDigits = 1;
    
    // 数字分割的尺寸
    numberFormatter.groupingSize = 4;
    
    // 除了groupingSize决定的尺寸外,其他数字位分割的尺寸
    numberFormatter.secondaryGroupingSize = 2;
    
    // 最大有效数字个数
    numberFormatter.maximumSignificantDigits = 12;
    
    // 最少有效数字个数
    numberFormatter.minimumSignificantDigits = 3;
    // 四色五入方式
    numberFormatter.roundingMode = kCFNumberFormatterRoundHalfUp;

数量单位格式化

数量单位格式化主要就是物理单位的换算,注意用到NSMeasurementFormatter(iOS10后可用)
可用单位列表如下:

列表 对应类 基础单位
加速度单位 NSUnitAcceleration m /s²
几何角度单位 NSUnitAngle 度(°)
面积单位 NSUnitArea 平方米(m²)
单元集中质量(密度) NSUnitConcentrationMass 毫克/分升(mg / dL)
单位分散 NSUnitDispersion 百万分率(ppm)
单位时间 NSUnitDuration 秒(s)
单位电荷 NSUnitElectricCharge 库仑(C)
单位电流 NSUnitElectricCurrent 安(A)
单位电位差(电压) NSUnitElectricCurrent 伏特(V)
单元电阻 NSUnitElectricResistance 欧姆(Ω)
单位能量 NSUnitEnergy 焦耳(J)
单位频率 NSUnitFrequency 赫兹(赫兹)
单位燃料效率 NSUnitFuelEfficiency 每百公里升(L / 100km)
单位长度 NSUnitLength 米(m)
单位照度 NSUnitIlluminance 勒克斯(lx)
单位质量 NSUnitMass 千克(kg)
单位功率 NSUnitPower 瓦特(W)
单位压力(压强) NSUnitPressure 牛顿每平方米(N /m²)
单位速度 NSUnitSpeed 米/秒(m / s)
单位温度 NSUnitTemperature 开尔文(K)
单位体积 NSUnitVolume 升(L)
NSMeasurementFormatter *formatter = [[NSMeasurementFormatter alloc] init];
    
[formatter setUnitOptions:NSMeasurementFormatterUnitOptionsProvidedUnit];
    
//    [formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"zh"]];
NSMeasurement *measurement1 = [[NSMeasurement alloc] initWithDoubleValue:12 unit:NSUnitAcceleration.metersPerSecondSquared];
NSMeasurement *measurement2 = [[NSMeasurement alloc] initWithDoubleValue:12 unit:NSUnitAcceleration.gravity];
    
//转换
NSMeasurement *measurement = [[NSMeasurement alloc] initWithDoubleValue:600 unit:NSUnitDuration.seconds];
NSMeasurement *measurement11 = [measurement measurementByConvertingToUnit:NSUnitDuration.minutes];
NSLog(@"%@",[formatter stringFromMeasurement:measurement11]); //10分    

字节转换

    NSByteCountFormatter *format = [[NSByteCountFormatter alloc] init];
     //以MB输出
    format.allowedUnits = NSByteCountFormatterUseMB;
    //1024字节为1KB
    format.countStyle = NSByteCountFormatterCountStyleBinary;
    // 输出结果显示单位
    format.includesUnit =  YES;
    // 输出结果显示数据
    format.includesCount = YES;
    //是否显示完整的字节
    format.includesActualByteCount = YES;
    NSString *str = [format stringFromByteCount:1024*1024];

其他类型转换,目前都可以使用NSMeasurementFormatter代替

    //能量格式化(卡cal)
    NSEnergyFormatter *formatter = [[NSEnergyFormatter alloc] init];
    formatter.forFoodEnergyUse = YES;
    NSString *outputString = [formatter stringFromJoules:1000.0];
    
    //质量格式化
    NSMassFormatter *massFormatter = [[NSMassFormatter alloc] init];
//    [massFormatter.numberFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"zh"]];
    massFormatter.unitStyle = NSFormattingUnitStyleLong;
    /// 输出 200克
    NSString *outputString1 = [massFormatter stringFromValue:200 unit:NSMassFormatterUnitGram];
    /// 输出 200千克
    NSString *outputString2 = [massFormatter stringFromKilograms:200];
    /// 输出 kilograms
    NSString *outputString3 = [massFormatter unitStringFromValue:1111 unit:NSMassFormatterUnitKilogram];
    
    //长度单位
    NSLengthFormatter  *lengthFormatter = [[NSLengthFormatter alloc] init];
    [lengthFormatter.numberFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"zh"]];
    lengthFormatter.unitStyle = NSFormattingUnitStyleLong;
    /// 输出 200米
    NSString *lengthOutputString1 = [lengthFormatter stringFromValue:200 unit:NSLengthFormatterUnitMeter];
    /// 输出 30米
    NSString *lengthOutputString2 = [lengthFormatter stringFromMeters:30];
    /// 输出 meters
    NSString *lengthOutputString3 = [lengthFormatter unitStringFromValue:33333.2 unit:NSLengthFormatterUnitMeter];

二.时间格式化

时间格式化是处理时间相关的格式时常用的NSDateFormatter
系统自带的几种格式:

格式 日期 时间
NSDateFormatterNoStyle "" ""
NSDateFormatterShortStyle 2019/7/31 上午11:40
NSDateFormatterMediumStyle 2019年7月31日 上午11:40:29
NSDateFormatterLongStyle 2019年7月31日 GMT+8 上午11:40:49
NSDateFormatterFullStyle 2019年7月31日 星期三 中国标准时间 上午11:41:16

自定义格式化

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    
    dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh"];
    //自定义格式
    [dateFormatter setDateFormat:@"yyyy年MM月dd日 EEE HH:mm:ss.SSS"];
    NSString *str = [dateFormatter stringFromDate:[NSDate date]];
参数参考:
GGG: 公元时代,例如AD公元
yy: 年的后2位
yyyy: 完整年
MM: 月,显示为1-12
MMM: 月,显示为英文月份简写,如 Jan
MMMM: 月,显示为英文月份全称,如 Janualy
dd: 日,2位数表示,如02
d: 日,1-2位显示,如 2
EEE: 简写星期几,如Sun
EEEE: 全写星期几,如Sunday
aa: 上下午,AM/PM
H: 时,24小时制,0-23
K:时,12小时制,0-11
m: 分,1-2位
mm: 分,2位
s: 秒,1-2位
ss: 秒,2位
S:毫秒
zzz:三位字符串表示“时区”(例如GMT)。缩写 Z

NSISO8601DateFormatter:专门处理ISO8601格式(iOS10后)

    NSISO8601DateFormatter *formatter = [[NSISO8601DateFormatter alloc]         init];
    formatter.formatOptions = NSISO8601DateFormatWithInternetDateTime;
    NSString* outputString = [formatter stringFromDate:[NSDate date]];

NSDateIntervalFormatter 两个日期范围格式化
可以将两个时间进行格式化

    NSDateIntervalFormatter *formatter = [[NSDateIntervalFormatter alloc] init];
    
    formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh"];
    formatter.dateStyle = NSDateIntervalFormatterMediumStyle;
    formatter.timeStyle = NSDateIntervalFormatterMediumStyle;
    
    NSDate *startDate = [NSDate date];
    NSDate *endDate = [NSDate dateWithTimeInterval:86400 sinceDate:startDate];
    
    NSString *outputString = [formatter stringFromDate:startDate toDate:endDate];

时间间隔比较NSDateComponentsFormatter

    NSDateComponentsFormatter *componentsFormatter = [NSDateComponentsFormatter new];
    componentsFormatter.unitsStyle = NSDateComponentsFormatterUnitsStyleFull;
    
    //比较结果显示格式
    componentsFormatter.allowedUnits = (NSCalendarUnitHour | NSCalendarUnitMinute|NSCalendarUnitSecond);
    
    NSDate *startDate = [NSDate date];
    NSDate *endDate = [NSDate dateWithTimeInterval:86450 sinceDate:startDate];
    
    NSString *outputString = [componentsFormatter stringFromDate:startDate toDate:endDate];

二.名片格式化

NSPersonNameComponentsFormatter用于将人物的信息进行格式化,但是感觉作用不是很大。唯一的优势是他会对名字信息根据不同的语言环境进行格式化。

    NSPersonNameComponentsFormatter *formatter = [[NSPersonNameComponentsFormatter alloc] init];
    NSPersonNameComponents *p = [[NSPersonNameComponents alloc] init];
    p.givenName = @"名字";
    p.familyName = @"姓";
    p.nameSuffix = @"后缀";
    p.namePrefix = @"前缀";
    p.nickname = @"昵称";
    p.middleName = @"中间符号";
    NSString *outputString1 =[formatter stringFromPersonNameComponents:p];
    formatter.style = NSPersonNameComponentsFormatterStyleLong;
    NSString *outputString2 =[formatter stringFromPersonNameComponents:p];

本文Demo

参考文章:iOS中物理单位换算
NSHipster-Formatter

你可能感兴趣的:(iOS 系统自带格式化方式总结(NSFormatter))