2013-09-01 15 views
5

Nie mogę wiarygodnie przekonwertować dłużej NSString na NSNumber. W szczególności przekształcam MPMediaEntityPropertyPersistentID jako ciąg znaków na NSNumber Czasami to działa, zwykle nie.Konwertuj długie NSString na numer NSNumber

kod konwersji:

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

Oto przykład udanego ciąg do zamiany liczb:

String: 3813955856659208324 
Number: 3813955856659208324 

I tu jest nieudana konwersja:

String: 12790162104953153719 
Number:1.279016210495315e+19 

Jest blisko, ale co się dzieje na końcu? Czy jest zbyt duży?

+0

Czy to musi być numer NSNumber? czy może to int lub unsigned int lub float? – CaptJak

+0

Myślę, że musi to być 'NSNumber', ponieważ funkcja odtwarzacza multimedialnego to bierze. Jednak jeśli możesz publikować konwersje liczb całkowitych, mogę wypróbować te w odtwarzaczu multimedialnym. –

+0

dobrze zrobić int będzie "NSString * string = @" 5 "; int value = [string intValue]; ' – CaptJak

Odpowiedz

8

Podobno największą liczbę całkowitą, która może być przetwarzany z NSNumberFormatter jest długo długo, co jest 9223372036854775807. Wszystko poza tym straci precyzji i nie wyjdzie, jak można umieścić to.

Zamiast tego użyj NSDecimalNumber, konkretnej podklasy NSNumber. A nawet może analizować strun się:

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

NSDecimalNumber może obsłużyć do 38 cyfr dziesiętnych liczb długo zanim straci precyzji.

3

ten sposób można to zrobić:

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

Dzięki, ale nie pasuje, 'ciąg: 15295462469298033064' daje mi' numberValue: 9223372036854775807' –

+0

Działa w wielu innych przypadkach! jakikolwiek pomysł, jak rozszerzyć możliwości, dzięki czemu mogę być w 100% pewny tych przypadków, w których utwór ma dłuższy identyfikator, taki jak powyżej? –

+0

to jest happening, ponieważ zbyt długo grasz w limicie ... więc potrzebujesz następnego dużego typu ... Szukam tego – Jatin