2013-09-01 101 views
5

我無法將長期NSString可靠地轉換爲NSNumber。具體而言,我將MPMediaEntityPropertyPersistentID作爲字符串轉換爲NSNumber有時它起作用,通常不起作用。將長NSString轉換爲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 

已經很接近了,但最後發生了什麼?它太大了嗎?

+0

它必須是NSNumber嗎?或者它可以是一個int或無符號整數或浮點數? – CaptJak

+0

我認爲它必須是一個'NSNumber',因爲媒體播放器的功能就是這樣。但是,如果您可以發佈整數轉換,我可以在媒體播放器中嘗試。 –

+0

以及做int會是'NSString * string = @「5」; int value = [string intValue];' – CaptJak

回答

8

顯然可以用NSNumberFormatter處理的最大整數值是很長很長,這是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]; 
+0

謝謝,但它不匹配,'字符串:15295462469298033064'給我'numberValue:9223372036854775807' –

+0

它在許多情況下工作,但!任何想法如何擴大能力,所以我可以百分之百肯定那些歌曲有更長的ID如上的情況? –

+0

這是偶然的,因爲你也長時間地碰到了極限......所以你需要下一個大的類型......我正在尋找它 – Jatin