我需要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]];
}
但是在这个特定的地方,整个事情都在界面构建器中设置,绑定到托管对象modell并使用数组控制器对象。在tableview中colum的第一个文本单元格中,我拖入了数字格式。我不知道是否可以定义一些自定义方法来调用格式,而不是使用此NumberFormatter。如果我拿走它,我跑的时候会出错。
谁有任何想法?答案 0 :(得分: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中,列(在单个列表中)的值绑定到Array Controller.arrangedObjects,其值变换器为RDTransformer。我没有任何格式化程序连接到表格单元格。