有时我们需要根据需求格式化数据,如:日期,数字。有时我们可能不知道系统已经提供了格式化的方式。还要自己写代码进行处理。本文就是对系统提供的各种格式化的方式进行总结。
一.数字和数量单位的格式化
数字格式化系统提供了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