将长的NSString转换为NSNumber

5

我无法可靠地将较长的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

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


我认为它必须是NSNumber,因为媒体播放器函数需要它。但是,如果您可以发布整数转换,我可以尝试在媒体播放器中使用它们。 - john cs
良好的实现方式是 NSString *string = @"5"; int value = [string intValue]; - CaptJak
很不幸它不能接收 int 类型,它会显示:在 ARC 模式下不允许将 int 隐式转换为 id - john cs
@Scott,是的,这是可能的,但是如果你看一下他的代码示例,你会发现他使用了那个答案,现在他正在尝试找出为什么那个答案对他不起作用。John,你有试过输入输出的数字吗?1.279016210495315e+19是一个正确的十进制表示法,可以表示那么长的数字。 - CaptJak
NSLog:1.429365487195657e+19 这样发送的可能性有多大呢?函数难道不能正常读取这种符号吗?我不知道发生了什么事情,也不知道为什么只在某些数字上出现这种情况。 - john cs
显示剩余2条评论
2个回答

8

显然,NSNumberFormatter 可以处理的最大整数是long long,即9223372036854775807。超出此范围的任何内容都将失去精度,并且不会与输入相同。

相反,请使用NSDecimalNumber,这是NSNumber的具体子类。它甚至可以自行解析字符串:

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

NSDecimalNumber可以处理长达38位数字的十进制数,而不会失去精度。


3
这是怎样做的方法:

步骤如下:

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

谢谢,但是不匹配,“string:15295462469298033064”给我“numberValue:9223372036854775807”。 - john cs
它在许多其他情况下都可以工作!有什么想法可以扩展功能,以便我可以100%确定那些歌曲具有更长的ID,例如上面提到的? - john cs
这是因为您达到了long long的限制,所以您需要使用更大的类型。我正在寻找它。 - Jatin
啊哇,我从没想到数字会变得如此之大,虽然我不是一个很好的开发者,但我会去看一下。如果有帮助的话,这里是另一个我发现无法工作的字符串 9223372036854775807 - john cs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接