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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容