2013-09-01 2 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 или unsigned int или float? – 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

Спасибо, но его не соответствует, 'string: 15295462469298033064' дает мне' numberValue: 9223372036854775807' –

+0

Он работает во многих случаях! любая идея, как расширить возможности, чтобы я мог быть на 100% уверен в тех случаях, когда песня имеет более длинный идентификатор, такой как выше? –

+0

это случайно, потому что вы слишком долго нажимаете на лимит ... так что вам нужен следующий большой тип ... Я ищу его – Jatin