2011-06-13 44 views
3

我試圖將一個很長的數字(如字符串接收),如'80182916772147201'保存到NSNumber中。試圖從字符串節省很長時間到NSNumber

NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; 
[f setNumberStyle:NSNumberFormatterBehaviorDefault]; 

[item setObject:[f numberFromString:@"80182916772147201"] forKey:@"theID"]; 
[f release]; 

當我的NSLog了這一點,假設這個字符串爲 '80182916772147201' 我得到:

NSLog(@"%lld", [[item objectForKey:@"theID"] longLongValue]); 

返回: '80182916772147200' - 注意捨去最後一位。

我在做什麼錯?

回答

3

問題是NSNumberFormatter已決定將該數字表示爲浮點數。強制它只使用整數:

[f setAllowsFloats:NO]; 
+0

完美,謝謝:) – mootymoots 2011-06-13 09:36:46

2

你可以試試嗎?

NSString *numStr = [NSString stringWithFormat:@"%llu", [myNum unsignedLongLongValue]]; 

這使得一些合理的假設,如numStr將只包含位數字,它包含一個「有效」無符號很長很長的價值。這種方法的一個缺點是UTF8String創建的內容基本相當於[[numStr dataUsingEncoding:NSUTF8StringEncoding]字節],或者換句話說,每個調用的內容都是32字節的自動釋放內存。對於絕大多數用途來說,這是沒有問題的。

有關如何將諸如unsignedLongLongValue之類的東西添加到NSString中的例子,它非常快並且不會使用自動釋放內存作爲副作用,請查看我的(長)回答這個SO問題的結尾。特別是rklIntValue的示例實現,它只需要微小的修改即可實現unsignedLongLongValue。