简介
前两天在做西班牙语国际化的时候,遇到了一个问题,就是在西班牙语中的“.”和“,”是和我们通常用的点作为小数点和逗号作为分隔符是相反的。也就是说如果一个小数1.23在西班牙语中为1,23;而10,000在西班牙语中为10.000。
实现思路
然后我开始想办法,总不能直接替换吧......在网上搜了半天才发现有一个极其好用的系统类NSNumberFormatter。其中有个decimalSeparator属性可以设置小数点样式,还有设置输出的小数位数。这样就好办了,我就可以写一个专门用来格式化的类,将所有需要显示的小数经过格式化。
当然我们不需要设置decimaSeparator属性,在汉语和英语中还是要以“.”来表示小数点的,而且只要经过这个类的转化,系统会自动根据当前的系统语言进行格式化显示成本语言的格式。
然后我整理了一下app中的小数,发现只有一位小数和两位小数两种,于是为了不在每次需要调用的时候都创建我就写了两个格式化类的单例(一个是格式化一位小数的一个是格式化两位小数的),这样在外部做调用时不需要写过多的重复代码。
具体实现
1.两个格式化单例
+ (NumberFormatter *)sharedNumberFormatterOneSignificantDigit
{
static NumberFormatter *numberFormatter1 = nil;
static dispatch_once_t _onceTime;
dispatch_once(&_onceTime,^{
numberFormatter1 = [[NumberFormatter alloc] init];
numberFormatter1.maximumFractionDigits = 1;
numberFormatter1.minimumFractionDigits = 1;
});
return numberFormatter1;
}
+ (NumberFormatter *)sharedNumberFormatterTwoSignificantDigit
{
static NumberFormatter *numberFormatter2 = nil;
static dispatch_once_t _onceTime;
dispatch_once(&_onceTime,^{
numberFormatter2 = [[NumberFormatter alloc] init];
numberFormatter2.maximumFractionDigits = 2;
numberFormatter2.minimumFractionDigits = 2;
});
return numberFormatter2;
}
2.因为这个类本身只有stringFromNumber和numberFromString两个格式化方法,而实际在程序中可能会有float、double或string类型的数字,所以为了方便我也直接加了相应方法。
- (NSString *)stringFromFloat:(CGFloat)floatnum
{
NSNumber *number = [NSNumber numberWithFloat:floatnum];
NSString *string = [self stringFromNumber:number];
return string;
}
- (NSString *)stringFromDouble:(double)doublenum
{
NSNumber *number = [NSNumber numberWithDouble:doublenum];
NSString *string = [self stringFromNumber:number];
return string;
}
- (NSString *)stringFromString:(NSString *)string
{
NSNumber *number = [NSNumber numberWithFloat:[string floatValue]];
NSString *formatterString = [self stringFromNumber:number];
return formatterString;
}
好了,这样在外面调用时基本只需一句代码就可以完成格式化了。
后续
当然这只是NSNumberFormatter其中一个小功能,这个类实际上是对数字类型进行格式化输出的,比如你可以把所有的货币输出统一起来设置好用它来输出(设置单位后缀、小数位数等)。不像我以前输出价格什么的方式就是:[NSString stringWithFormat:@"%f元",1.23]
这样了=。=
想详细了解的可以点击上面那个连接或者点这里_
网友评论