最近在项目中遇到了对金额千分位显示的问题,封装了个函数
//金额千分位显示,保留小数点后两位
+ (NSString *)positiveFormat:(NSString *)text{
if(!text || [text floatValue] == 0){
return @"0.00";
}else{
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setPositiveFormat:@",###.00;"];
return [numberFormatter stringFromNumber:[NSNumber numberWithDouble:[text doubleValue]]];
}
return @"";
}
后来仔细查了查资料和官方API,现在对NSNumber和NSNumberFormatter这两个类做一个简单的介绍
NSNumber数字类,iOS专门封装起来用于数字的处理,可以用string、double、float初始化
NSNumberFormatter数字格式类,用于定义数字的格式
NSNumber过于简单,不再详述
下面在写一段代码,通过代码讲解下NSNumberFormatter
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setFormatterBehavior:NSFoundationVersionNumber10_4];
[formatter setNumberStyle:NSNumberFormatterScientificStyle];
[formatter setFormatWidth:9]; // set width
[formatter setPaddingCharacter:@"x"]; // choice padding Char
NSString *convertNumber = [formatter stringFromNumber:number];
下面讲下每个函数:
setFormatterBehavior这个设置和版本有关系,一般不用设置,不用这个函数也可以;
setNumberStyle设置文本显示的格式,是个枚举类型,下面是官方文档+个人翻译
enum {
NSNumberFormatterNoStyle = kCFNumberFormatterNoStyle,
NSNumberFormatterDecimalStyle = kCFNumberFormatterDecimalStyle,
NSNumberFormatterCurrencyStyle = kCFNumberFormatterCurrencyStyle,
NSNumberFormatterPercentStyle = kCFNumberFormatterPercentStyle,
NSNumberFormatterScientificStyle = kCFNumberFormatterScientificStyle,
NSNumberFormatterSpellOutStyle = kCFNumberFormatterSpellOutStyle
};
typedef NSUInteger NSNumberFormatterStyle;
Constants
NSNumberFormatterNoStyle
Specifies no style.//无格式
Available in OS X v10.4 and later.
NSNumberFormatterDecimalStyle
Specifies a decimal style format.//十进制格式
Available in OS X v10.4 and later.
NSNumberFormatterCurrencyStyle
Specifies a currency style format.//当前系统货币格式(如果是中文就是人民币符号¥)
Available in OS X v10.4 and later.
NSNumberFormatterPercentStyle
Specifies a percent style format.//百分数格式
Available in OS X v10.4 and later.
NSNumberFormatterScientificStyle
Specifies a scientific style format.//科学技术发格式
Available in OS X v10.4 and later.
NSNumberFormatterSpellOutStyle
Specifies a spell-out format; for example, “23” becomes “twenty-three”.//阿拉伯数字转化为文字的格式如“23”变为二三
Available in OS X v10.4 and later.
setFormatWidth设置字符宽度
setPaddingCharacter设置填充字幕:比如你设置的宽度为9,结果数字只有3位,其它的6位用这个函数设置的字母填充。
还有一些其他的方法,用的不多,这里不再详述。
但是,我们发现,我最上边封装的函数用的并不是这个来格式化输出的,而是用的setPositiveFormat,setPositiveFormat是自定义输出格式可以灵活的设置输出格式,而不是仅仅限于上边枚举的几项
那格式应该怎么定义呢?举几个例子你就明白了
如果原始的数字为677789.98
[numberFormatter setPositiveFormat:@",###.00”];//输出:677,789.98
[numberFormatter setPositiveFormat:@".00;”]//输出:677789.98
[numberFormatter setPositiveFormat:@“0%;”]//输出:67778998%
[numberFormatter setPositiveFormat:@“0.00%;”]//输出:67778998.00%
是不是一目了然啦?不用我再多说什么了吧?如果有多个自定义条件,就用;分开
说这这里,你是不是有个疑惑?”#“和“0”有什么不同呢?开始我也有这个疑惑,但是经过大量的实验发现”#“和“0”代表的含义没有任何区别,完全可以相互替换。