2013-06-27 39 views
1

我已成立了一个NSNumberFormatter如下:NSNumberFormatter - 如何截断高位值的小数位?

formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[formatter setMinimumFractionDigits:2]; 
[formatter setMaximumFractionDigits:2]; 
[formatter setGroupingSize:3]; 

不过,我想修改它,使它不显示值100,000或更大的小数位。这可能没有创建另一个格式化程序?

+0

您能否为国际用户精确地指定一个“小数位”? – rdurand

+0

你的意思是你想得到** 3,240.45 **,但是** 324,329 **而不是** 324,329.12 **? – rdurand

+0

'formatter.usesGroupingSeparator = NO'?我同意rdurand的意见,请提供预期的语言环境。 – JFS

回答

2

如果要截断大数字的十进制值(打印,而不是324,329.12),这里是你可以做什么。

NSNumberFormatter(新建文件> Objective-C类别)上创建一个类别,我打电话给我的地址为TruncateHigh。这将创建两个文件,NSNumberFormatter+TruncateHigh.hNSNumberFormatter+TruncateHigh.m

NSNumberFormatter + TruncateHigh.h:

#import <Foundation/Foundation.h> 

@interface NSNumberFormatter (TruncateHigh) 

- (NSString *)customStringFromNumber:(NSNumber *)number; 

@end 

NSNumberFormatter + TruncateHigh.m:

#import "NSNumberFormatter+TruncateHigh.h" 

@implementation NSNumberFormatter (TruncateHigh) 

- (NSString *)customStringFromNumber:(NSNumber *)number { 

    if (number.floatValue > 100000) { 
     [self setMaximumFractionDigits:0]; 
    } else { 
     [self setMaximumFractionDigits:2]; 
    } 

    return [self stringFromNumber:number]; 
} 

@end 

用法在YourViewController.m:

#import "YourViewController.h" 
#import "NSNumberFormatter+TruncateHigh.h" 

@implementation YourViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
    [formatter setGroupingSize:3]; 

    NSNumber *smallNumber = [NSNumber numberWithFloat:12386.43]; 
    NSNumber *bigNumber = [NSNumber numberWithFloat:8567386.43]; 

    NSLog(@"Small Number : %@", [formatter customStringFromNumber:smallNumber]); 
    NSLog(@"Big Number : %@", [formatter customStringFromNumber:bigNumber]); 
} 

@end 

这里是日志:

test[7050:11303] Small Number : 12,386.43 
test[7050:11303] Big Number : 8,567,386 

这将打印数量超过100000较小的有2个小数和数字更大的,没有十进制值。您可以自定义代码以使其完全按照您的要求工作。

让我知道是否有东西丢失。

+0

我认为使用2个numberformatters将是一个更干净的解决方案。有一点奇怪,只读方法会改变格式器的内部状态。 – Sulthan

+0

我同意,2格式化程序会更干净。但是这个问题指出:“这可能没有创建另一个格式化程序?”。答案是“是的,这是如何!” :) – rdurand

+0

感谢您的答案!是的,你是对的,这是如何做到这一点......但我想我可能会坚持我的两个格式化程序。我没有检查,但我会认为这将是更快的解决方案,特别是因为我几乎每一次屏幕更新都要求'stringFromNumber:'。 – jowie