2013-09-01 14 views
5

Ich bin nicht in der Lage, länger NSString zu NSNumber zuverlässig zu konvertieren. Insbesondere konvertiere ich MPMediaEntityPropertyPersistentID als eine Zeichenfolge zu einem NSNumber Manchmal funktioniert es, normalerweise nicht.Convert long NSString zu NSNumber

Conversion-Code:

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

Hier ist ein Beispiel für einen erfolgreiche Zeichenfolge Anzahl Umwandlung:

String: 3813955856659208324 
Number: 3813955856659208324 

Und hier ist eine erfolglose Umwandlung:

String: 12790162104953153719 
Number:1.279016210495315e+19 

Es ist in der Nähe, aber Was passiert am Ende? Ist es zu groß?

+0

Muss es NSNummer sein? oder kann es ein int oder unsigned int oder ein float sein? – CaptJak

+0

Ich denke, es muss eine 'NSNummer' sein, da die Media Player-Funktion das übernimmt. Wenn Sie jedoch Integer-Conversions posten können, kann ich diese im Media Player ausprobieren. –

+0

gut int zu tun wäre 'NSString * string = @" 5 "; int value = [string intValue]; ' – CaptJak

Antwort

8

Anscheinend ist die größte ganze Zahl, die mit NSNumberFormatter verarbeitet werden können, lange lang ist, was 9223372036854775807. Alles darüber hinaus Präzision verlieren wird und kommen nicht, wie Sie setzen es in.

Verwenden Sie stattdessen NSDecimalNumber, eine konkrete Unterklasse von NSNumber. Und es kann sogar Strings selbst analysieren:

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

NSDecimalNumber verarbeiten kann bis zu 38-stellige lange Dezimalzahlen, bevor es Präzision verliert.

3

Dies ist, wie Sie es tun:

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

Danke, aber es ist nicht passend, 'string: 15295462469298033064' gibt mir' numberValue: 9223372036854775807' –

+0

Es funktioniert aber in vielen mehr Fällen! Irgendeine Idee, wie man die Fähigkeit erweitert, damit ich 100% der Fälle sicher sein kann, in denen der Song eine längere ID wie oben hat? –

+0

Das ist passiert, weil Sie das Limit für lange auch treffen ... so brauchen Sie den nächsten großen Typ ... Ich bin auf der Suche nach – Jatin