2014-10-27 3 views
-1

Я пытаюсь преобразовать строковое значение в NSNumber с ниже код, который хранится в базе данных CoreData:Преобразование NSString в NSNumber

NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; 
[f setNumberStyle:NSNumberFormatterDecimalStyle]; 

NSLog(@"OrigLoc: '%@', OrigLat '%@'", [item objectForKey: @"origLocHorizontal"], [item objectForKey: @"originLatitude"]); 

[tour setOriginLatitude: [f numberFromString:[item objectForKey: @"originLatitude"]]]; 
[tour setOriginLongitude: [f numberFromString:[item objectForKey: @"originLongitude"]]]; 
[tour setOrigLocHorizontal: [f numberFromString:[item objectForKey: @"origLocHorizontal"]]]; 
[tour setOrigLocVertical: [f numberFromString:[item objectForKey: @"origLocVertical"]]]; 

Результат NSLog является: «OrigLoc:" 206.195 ', OrigLat '41 .824989318847656' "

Дамп на iPhone 6« тура »дает:« origLocHorizontal = «206.195»; Дамп на iPhone 5 дает: origLocHorizontal = 206195;

(обратите внимание на разницу «ххх»)

Это прекрасно работает для «двойного» поля в CoreData, но не для «поплавок». Значение 25,5 сохраняется вместо 25500. Это похоже на не 64-битные iOS-устройства, хотя это может быть просто совпадением с реальной проблемой.

У кого-нибудь есть предложения по поводу этой проблемы?

+1

Возможно, проблема локали? '.' обычно используется в качестве разделителя тысяч (в отличие от разделителя десятичных чисел, который является запятой) в большинстве неанглоязычных стран. –

+0

@ TheParamagneticCroissant Но эти локали используют одно и то же соглашение для 'double' и' float'. – trojanfoe

+0

Сначала мы думали, что это запятая и полная остановка, так как это еще одна разница между устройствами. Но он не объясняет, почему он работает для одного значения, а не для другого. –

ответ

0

Проблема не в NSNumberFormatter, это где-то еще в коде.

Разбейте заявление, которое не работает в нескольких заявлениях и не обнаруживает проблему. Сначала получите NSString, затем конвертируйте в NSNumber, затем установите в туре. Записывать после каждого утверждения.

NSNumberFormatter *numberFormatter = [NSNumberFormatter new]; 

NSString *numberAsString = [item objectForKey: @"originLatitude"]; 
NSLog(@"numberAsString: %@", numberAsString); 

NSNumber *number = [numberFormatter numberFromString:numberAsString]; 

или

NSNumber *number = @[numberAsString:doubleValue]); 

NSLog(@"number: %@", number); 

[tour setOriginLatitude: number]; 
// NSLog from Core Data 

Примечание: вы действительно не нужно, чтобы установить setNumberStyle: NSNumberFormatterDecimalStyle, наверное, не стоит.

+0

NSLog (@ "Строка OrigLoc: '% @', OrigLoc '% f'", [item objectForKey: @ "origLocHorizontal"], [[tour origLocHorizontal] floatValue]); «Строка OrigLoc:« 208.461 », OrigLoc '208461.000000'" –

+0

Удаление NSNumberFormatDecimalStyle и добавление [f setDecimalSeparator: @ "."]; похоже работа. Проверяя это сейчас. –

Смежные вопросы