2012-11-11 98 views
0

我需要NSNumberFormatter有条件地显示非常大或非常小的数字作为科学记数法。但是,如果数字可以没有,我需要它只有十进制。 6.62e-34好,但4,2E1不好。NSNumberformatter准科学记数法

系统的其它部分,我一直在使用下面的方法解决了这个:

- (NSString *) formatNumber: (double) d { 
    BOOL sci=NO; 
    double dd = d; 
    if (dd<0.0) dd=(-d); 
    if ((dd>0.0) && (dd<1e-3)) sci=YES; 
    if (dd>1e+8) sci=YES; 
    if (sci) [nf setNumberStyle:NSNumberFormatterScientificStyle]; 
    else [nf setNumberStyle:NSNumberFormatterDecimalStyle]; 
    return [nf stringFromNumber:[NSNumber numberWithDouble:d]]; 
} 

但在这个特殊的地方,整个事情是建立在界面生成器,使用绑定到一个管理对象莫代尔和使用数组控制器对象。在tableview中的第一个文本单元格中,我拖入了数字格式化器。我不知道是否可以定义一些自定义的方法来调用格式,而不是使用这个NumberFormatter。如果我把它拿走,我运行它时会出错。

任何人有一些想法?

+0

您可以使用if-else来相应地检查并显示... –

+0

您是否想要从单个NSNumberFormatter中获取6.62e-32和421? –

+0

您是使用数据源填充表视图,还是使用绑定? – rdelmar

回答

1

你想要做的是写一个NSValueTransformer的子类。然后,您可以在绑定检查器中提供IB中该变换器类的名称。下面是一个例子:

@implementation RDTransformer 

- (id)init { 
    if (self = [super init]) { 
     self.formatter = [[NSNumberFormatter alloc] init]; 
     [self.formatter setNumberStyle:NSNumberFormatterScientificStyle]; 
     [self.formatter setMaximumFractionDigits:3]; 
    } 
    return self; 
} 

+(Class)transformedValueClass { 
    return [NSString class]; 
} 

+(BOOL)allowsReverseTransformation { 
    return NO; 
} 

-(id)transformedValue:(NSNumber *)value { 
    if ([value compare:@1000] == NSOrderedAscending) { 
     return value.stringValue; 
    }else{ 
     return [self.formatter stringFromNumber:value]; 
    } 

} 

在图1B中,柱(在单个列表)具有其结合到阵列Controller.arrangedObjects与RDTransformer的值变压器值。我没有任何格式化器连接到表格单元格。