2010-07-15 24 views
3

我有一个应用程序使用ObjectiveResource并且有一个包含NSNumber属性的类。我想格式化的NSNumber值作为整数,有下面的代码:ObjectiveResource和破损的NSNumberFormatter

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 

[formatter setNumberStyle:NSNumberFormatterCurrencyStyle]; 

NSLog(@"Price: %@", [formatter stringFromNumber:self.item.price]) 
NSLog(@"Price: %@", [formatter stringFromNumber:[NSNumber numberWithDouble:[self.item.price doubleValue]]]); 

[formatter release]; 

,输出:

2010-07-15 19:33:45.371 样品[4193:207]酒精度:(空)
2010-07-15 19:33:45.453 样品[4193:207]酒精:$ 13.50

我不知道为什么第一个项目输出(空),尚第二工作正常。我宁愿使用第一个语法,而不必重新创建一个NSNumber。

+1

'price'是否声明为'NSNumber *'?什么是只是'NSLog(@“%@”,self.item.price)的结果;'? – warrenm 2010-07-15 23:50:55

+0

@ warrenm价格是NSNumber *,NSLog(@“%@”,self.item.price)的结果是13.5。 – 2010-07-16 00:02:27

+0

第一行适用于我的简短测试,所以看起来罪魁祸首可能会超出NSNumberFormatter。您是否尝试通过KVO注册“价格”更改?其父对象是否被同时更新? – warrenm 2010-07-16 01:54:38

回答

2

self.item.price可能是一个NSString?

通过一个可怕的黑客,我可以精确地再现你的结果:

NSNumber *price = (NSNumber*)@"13.5"; // *shiver*, don't try this at home! 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 

[formatter setNumberStyle:NSNumberFormatterCurrencyStyle]; 

NSLog(@"Price: %@", [formatter stringFromNumber:price]); 
NSLog(@"Price: %@", [formatter stringFromNumber:[NSNumber numberWithDouble:[price doubleValue]]]); 

由于NSString响应doubleValue,这出来:

2010-07-16 17:17:50.384 test[716:207] Price: (null) 
2010-07-16 17:17:50.386 test[716:207] Price: $13.50 
+0

我不确定它是否可以解决,但这是一种巧妙的方式 – vodkhang 2010-07-16 15:30:37

+0

感谢MVDS。我看了一下ActiveResource代码,事实确实如此。我添加了下面的修复程序: – 2010-07-16 15:31:22

1

要解决,在XML元素代表(XMLElementDelegate。 m)需要取消部分代码以支持NSNumber。该行是:

// uncomment this if you what to support NSNumber and NSDecimalNumber 
// if you do your classId must be a NSNumber since rails will pass it as such 
else if ([type isEqualToString:@"decimal"]) { 
    return [NSDecimalNumber decimalNumberWithString:propertyValue]; 
} 
else if ([type isEqualToString:@"integer"]) { 
    return [NSNumber numberWithInt:[propertyValue intValue]]; 
}