2010-07-15 43 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]]; 
}