将长NSString转换为NSNumber

时间:2013-09-01 02:34:45

标签: ios objective-c nsnumberformatter

我无法将较长的NSString可靠地转换为NSNumber。具体来说,我正在将MPMediaEntityPropertyPersistentID作为字符串转换为NSNumber。有时它会起作用,通常不会。

转换代码:

 NSString *keke = [jsonArray objectForKey:@"next"];
 NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
 [f setNumberStyle:NSNumberFormatterDecimalStyle];
 NSNumber *persistentIDasNumber = [f numberFromString:keke];

以下是成功进行数字转换的示例:

String: 3813955856659208324
Number: 3813955856659208324

这是一次不成功的转换:

String: 12790162104953153719 
Number:1.279016210495315e+19

它很接近但最后发生了什么?它太大了吗?

2 个答案:

答案 0 :(得分:8)

显然,可以使用NSNumberFormatter处理的最大整数是很长的,即9223372036854775807。除此之外的任何东西都会失去精确度而不会在你输入时出现。

而是使用NSDecimalNumber,NSNumber的具体子类。它甚至可以自己解析字符串:

NSDecimalNumber *dn=[[NSDecimalNumber alloc]initWithString:@"12790162104953153719"];
NSLog(@"dn: %@",dn);

NSDecimalNumber在丢失精度之前最多可以处理38位长的十进制数。

答案 1 :(得分:3)

您就是这样做的:

unsigned long long number = [[jsonArray objectForKey:@"next"] longLongValue];
    NSNumber * numberValue = [NSNumber numberWithUnsignedLongLong:number];