将长NSString转换为NSNumber

joh*_* cs 5 objective-c nsnumberformatter ios

我无法可靠地将更长时间转换NSStringNSNumber.具体来说,我将MPMediaEntityPropertyPersistentID字符串转换为NSNumber 有时它有效,通常不会.

转换代码:

 NSString *keke = [jsonArray objectForKey:@"next"];
 NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
 [f setNumberStyle:NSNumberFormatterDecimalStyle];
 NSNumber *persistentIDasNumber = [f numberFromString:keke];
Run Code Online (Sandbox Code Playgroud)

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

String: 3813955856659208324
Number: 3813955856659208324
Run Code Online (Sandbox Code Playgroud)

这是一个不成功的转换:

String: 12790162104953153719 
Number:1.279016210495315e+19
Run Code Online (Sandbox Code Playgroud)

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

Ger*_*d K 8

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

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

NSDecimalNumber *dn=[[NSDecimalNumber alloc]initWithString:@"12790162104953153719"];
NSLog(@"dn: %@",dn);
Run Code Online (Sandbox Code Playgroud)

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