2012-11-11 97 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的值變壓器值。我沒有任何格式化器連接到表格單元格。