iOS数字格式化NSNumberFormatter

系统提供的样式

NSString *string = @"123456.654321";
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.numberStyle = kCFNumberFormatterCurrencyStyle;
NSNumber *number = [NSNumber numberWithDouble:string.doubleValue];
NSString *result = [formatter stringFromNumber:number];
NSLog(@"result is:%@",result);
typedef CF_ENUM(CFIndex, CFNumberFormatterStyle) {  // number format styles
    kCFNumberFormatterNoStyle = 0,    // 自末位开始四舍五入至整数位 123457
    kCFNumberFormatterDecimalStyle = 1,    // 小数点后最多3位 123,456.654
    kCFNumberFormatterCurrencyStyle = 2, // 国际化货币格式 符号与手机系统地区设置有关  $123,456.65
    kCFNumberFormatterPercentStyle = 3,  // 末位由千分位四舍五入得到12,345,665%
    kCFNumberFormatterScientificStyle = 4,  // 1.23456654321E5
    kCFNumberFormatterSpellOutStyle = 5,  // 与项目的国际化语言设置有关  项目支持多个则取第一个语言设置 十二万三千四百五十六点六五四三二一
    kCFNumberFormatterOrdinalStyle = 6,  // 与项目的国际化语言设置有关 末位由十分位四舍五入得到 123,457th
    kCFNumberFormatterCurrencyISOCodeStyle = 8,   // 前缀与手机系统地区设置有关 CNY123,456.65
    kCFNumberFormatterCurrencyPluralStyle = 9,  // 后缀与手机系统地区设置有关  后缀使用的语言与项目的国际化语言设置有关 末位由千分位四舍五入得到 123,456.56 US dollars
    kCFNumberFormatterCurrencyAccountingStyle = 10,  // 前缀与手机系统地区设置有关 末位由千分位四舍五入得到 ¥123,456.65  US$123,456.65  
};

自定义样式

关于数字特殊字符 0 和 #的一些简单说明

#是一个特殊字符,用于数字部分(相当于占位符);它表示显示数字,但是最首位的0不予显示。
#用于整数部分没有数位的限制,但是用于小数部分,却有“最多只能有多少位小数的意思”,多余的进行四舍五入。

NSString *string = @"0123456.654555";
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.positiveFormat = @",###.##";
NSNumber *number = [NSNumber numberWithDouble:string.doubleValue];
NSString *result = [formatter stringFromNumber:number];
NSLog(@"result is:%@",result);    // 123,456.65
formatter.positiveFormat = @"#.###";
NSNumber *number2 = [NSNumber numberWithDouble:string.doubleValue];
NSString *result2 = [formatter stringFromNumber:number2];
NSLog(@"result2 is:%@", result2);   // 123456.655

0和#的用法是相近的,却又略有不同;不同之处在于:
对于整数部分,0限制整数部分最少出现的位数,不足补0,多出的不变,但是最首位的0不予显示。
对于小数部分,0限制小数部分最少出现的位数,不足补0,多出的五舍六入

NSString *string = @"027.65";
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.positiveFormat = @"0000.0000";
NSNumber *number = [NSNumber numberWithDouble:string.doubleValue];
NSString *result = [formatter stringFromNumber:number];
NSLog(@"result is:%@",result);  // 0027.6500
formatter.positiveFormat = @"0.0";
NSNumber *number2 = [NSNumber numberWithDouble:string.doubleValue];
NSString *result2 = [formatter stringFromNumber:number2];
NSLog(@"result2 is:%@", result2);  // 27.6

其他的特殊样式符号见下表:

符号 位置 本地化 含义
0 数字 阿拉伯数字
# 数字 阿拉伯数字
. 数字 小数分隔符或货币小数分隔符
- 数字 减号
, 数字 分组分隔符
E 数字 分隔科学计数法中的尾数和指数。在前缀或后缀中无需加引号。
子模式边界 分隔正数和负数子模式
% 前缀或后缀 乘以 100 并显示为百分数
前缀或后缀 乘以 1000 并显示为千分数
¤ (\u00A4) 前缀或后缀 货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符。
' 前缀或后缀 用于在前缀或或后缀中为特殊字符加引号,例如 "'#'#" 将 123 格式化为 "#123"。要创建单引号本身,请连续使用两个单引号:"# o''clock"。

常用自定义样式

NSString *string = @"5277";
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
// 转化为小数点后两位,并前面添加固定货币符号¥
formatter.positiveFormat = @"¥0.00";
NSNumber *number = [NSNumber numberWithDouble:string.doubleValue];
NSString *result = [formatter stringFromNumber:number];
NSLog(@"result is:%@",result);  // ¥5277.00
// 转化为小数点后两位,并前面添加固定货币符号¥,并3位一组表示货币
formatter.positiveFormat = @"¥,##0.00";
NSNumber *number2 = [NSNumber numberWithDouble:string.doubleValue];
NSString *result2 = [formatter stringFromNumber:number2];
NSLog(@"result2 is:%@",result2);  // ¥5,277.00
// 转化为百分数
string = @"0.5277";
formatter.positiveFormat = @"0%";
NSNumber *number3 = [NSNumber numberWithDouble:string.doubleValue];
NSString *result3 = [formatter stringFromNumber:number3];
NSLog(@"result3 is:%@",result3);  // 53%
// 转化为百分数,并保留一位小数 
formatter.positiveFormat = @"0.0%";
NSNumber *number4 = [NSNumber numberWithDouble:string.doubleValue];
NSString *result4 = [formatter stringFromNumber:number4];
NSLog(@"result4 is:%@",result4);    // 52.8%
// 添加任意字符
formatter.positiveFormat = @"陈拾柒 0.0% 到此一游";
NSNumber *number5 = [NSNumber numberWithDouble:string.doubleValue];
NSString *result5 = [formatter stringFromNumber:number5];
NSLog(@"result5 is:%@",result5);   // 陈拾柒 52.8% 到此一游

参考文献
Android 中 DecimalFormat 类的官方文档

你可能感兴趣的:(iOS数字格式化NSNumberFormatter)