前言
做项目中经常会遇到将数字转化位千分位显示的情况。之前通过对字符串的处理来达到目的,这种方法逻辑复杂,会出现显示不是自己想要的样子。
原来苹果已经给我们封装了类来帮助我们方便的转化格式。
一、NSNumberFormatter
NSNumberFormatter继承NSFormatter,负责数字模式的显示样式。设置numberStyle来设置显示的样式。
如设置为:NSNumberFormatterDecimalStyle
double number = 123456.6789;
NSNumberFormatter *formatter = [[NSNumberFormatter alloc]init];
formatter.numberStyle =NSNumberFormatterDecimalStyle;
NSString *newAmount = [formatter stringFromNumber:[NSNumber numberWithDouble:number]];
// 打印:123,456.679
其他样式选项:
typedef NS_ENUM(NSUInteger, NSNumberFormatterStyle) {
NSNumberFormatterNoStyle = kCFNumberFormatterNoStyle,
NSNumberFormatterDecimalStyle = kCFNumberFormatterDecimalStyle,
NSNumberFormatterCurrencyStyle = kCFNumberFormatterCurrencyStyle,
NSNumberFormatterPercentStyle = kCFNumberFormatterPercentStyle,
NSNumberFormatterScientificStyle = kCFNumberFormatterScientificStyle,
NSNumberFormatterSpellOutStyle = kCFNumberFormatterSpellOutStyle,
NSNumberFormatterOrdinalStyle API_AVAILABLE(macos(10.11), ios(9.0), watchos(2.0), tvos(9.0)) = kCFNumberFormatterOrdinalStyle,
NSNumberFormatterCurrencyISOCodeStyle API_AVAILABLE(macos(10.11), ios(9.0), watchos(2.0), tvos(9.0)) = kCFNumberFormatterCurrencyISOCodeStyle,
NSNumberFormatterCurrencyPluralStyle API_AVAILABLE(macos(10.11), ios(9.0), watchos(2.0), tvos(9.0)) = kCFNumberFormatterCurrencyPluralStyle,
NSNumberFormatterCurrencyAccountingStyle API_AVAILABLE(macos(10.11), ios(9.0), watchos(2.0), tvos(9.0)) = kCFNumberFormatterCurrencyAccountingStyle,
};
二、自定义样式
通过方法setPositiveFormat:可以设置自己想要的样式。
如:千分位,且保留两位小数。
double number = 123456.6789;
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setPositiveFormat:@"###,##0.00"];
NSString *formattedNumberString = [numberFormatter stringFromNumber:[NSNumber numberWithDouble:number]];
NSLog(@"%@",formattedNumberString);
// 打印:123,456.68
大家可能对格式中的符号代表的含义不是很清楚,这里讲一下我的理解。
- .符号代表显示小数点的位置。格式和小数有关系的时候用到。
- 0代表占位,如果这个位置没有数字,则使用0填充。如:
double number = 0.6789;
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setPositiveFormat:@"00.00"];
NSString *formattedNumberString = [numberFormatter stringFromNumber:[NSNumber numberWithDouble:number]];
NSLog(@"%@",formattedNumberString);
//打印:00.68
- #代表占位。如果这个位置没有数字,则不显示。如:
例1:
double number = 0.6789;
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setPositiveFormat:@"##.00"];
NSString *formattedNumberString = [numberFormatter stringFromNumber:[NSNumber numberWithDouble:number]];
NSLog(@"%@",formattedNumberString);
// 打印:.68
例2:
double number = 0.6789000000;
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setPositiveFormat:@"##.#####"];
NSString *formattedNumberString = [numberFormatter stringFromNumber:[NSNumber numberWithDouble:number]];
NSLog(@"%@",formattedNumberString);
//打印:0.6789
参考资料:
https://unicode.org/reports/tr35/tr35-6.html#Number_Format_Patterns