0

非常に大きい数または非常に小さい数を科学的記数法として条件付きで表示するには、NSNumberFormatterが必要です。ただし、数値を表示せずに表示できる場合は、小数のみである必要があります。6.62e-34は問題ありませんが、4,2E1は問題ありません。

システムの他の場所で、次の方法を使用してこれを解決しました。

- (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]];
}

しかし、この特定の場所では、すべてがInterface Builderでセットアップされ、管理対象オブジェクトmodellにバインドされ、配列コントローラーオブジェクトが使用されます。テーブルビューの列の最初のテキストセルで、numberformatterをドラッグしました。このNumberFormatterを使用する代わりに、フォーマットを実行するために呼び出されるカスタムメソッドを定義できるかどうかはわかりません。持ち去ると、実行時にエラーが発生します。

誰かが何か考えを持っていますか?

4

1 に答える 1

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];
    }

}

IBでは、列(単一列テーブル内)の値は、RDTransformerの値トランスフォーマーを使用してArrayController.arrangedObjectsにバインドされます。テーブルセルに接続されているフォーマッタがありません。

于 2012-11-11T22:37:58.777 に答える