Objective c NSNumberformatter准科学符号

Objective c NSNumberformatter准科学符号,objective-c,cocoa,nsnumberformatter,Objective C,Cocoa,Nsnumberformatter,我需要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) &&a

我需要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]];
}
-(NSString*)格式编号:(双精度)d{
BOOL-sci=NO;
双dd=d;
如果(dd0.0)和(dd1e+8)sci=是;
if(sci)[nf setNumberStyle:NSNumberFormatterScientificStyle];
else[nf setNumberStyle:NSNumberFormatterDecimalStyle];
返回[nf stringFromNumber:[NSNumber numberWithDouble:d]];
}
但在这个特殊的地方,整个过程都是在interface builder中设置的,绑定到托管对象Model并使用array controller对象。在tableview中列的第一个文本单元格中,我拖入了numberformatter。我不知道是否可以定义一些自定义方法来调用来进行格式化,而不是使用这个数字格式。如果我把它拿走,我运行它时会出错


有人知道吗

您要做的是编写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中,列(在单列表中)的值绑定到Array Controller.arrangedObjects,值转换器为RDTransformer。我没有任何格式设置程序连接到表单元格。

您可以使用if-else进行相应的检查和显示…是否希望从单个NSNumber格式设置6.62e-32和421?您是使用数据源填充表视图,还是使用绑定?我使用到托管对象模型的绑定,NSNumberFormatter被拖到表的文本单元格中,并直接在xcode的.xib编辑器中配置。这里设置了与阵列控制器的绑定和所有内容。在我正在研究的系统的其他地方,我已经编程了一个解决方案,可以根据数字的值打开和关闭科学模式。这里没有编程,我不知道在哪里输入代码来绕过它。to@AnoopVaidya:是的,它是放在Xcode.xib编辑器表格单元格中的数字格式。