Преобразование строк в целые числа на arm64?

У меня есть небольшой фрагмент кода, который, как я заметил, ведет себя по-разному для целей arm64. Я извлекаю числовую строку из данных JSON, а затем использую integerValue для преобразования строки в целое число. Строка обычно содержит разделители тысяч в виде запятой.

На не-64-битных целях (iPhone 4/s, 5/s и т. д.) все работает отлично, и я получаю правильное целое число независимо от того, есть ли запятая, разделяющая тысячи. Однако на arm64 integerValue возвращает только первый «кусок» чисел до запятой-разделителя. Я включил код и пример результата, чтобы показать, что именно происходит:

NSInteger value = [BTCValue integerValue];
[UIApplication sharedApplication].applicationIconBadgeNumber = value;

Например, для не-64-битных целей: BTCValue = @"54,321.00" и value = 54321.

Однако на arm64 цели: BTCValue = @"54,321.00" и value = 54.

Кажется, не имеет значения, является ли value int или NSInteger, независимо от того, происходит то же самое. Есть что-то, чего мне не хватает? Я не понимаю, почему на armv7 все работает правильно, а на arm64 нет.


person Radrider33    schedule 05.01.2014    source источник
comment
Идею о том, что процессор является причиной этого, немного трудно проглотить. Вы уверены, что локализация на вашем устройстве arm64 такая же, как и на других?   -  person jscs    schedule 06.01.2014
comment
Я запускаю тот же код на симуляторе iPhone. Локаль на обоих одинакова.   -  person Radrider33    schedule 06.01.2014
comment
Вы можете пояснить это замечание? Ни одно ваше тестирование не проводится на устройстве? Или вы тестировали на: а) не64-битных устройствах, б) 64-битных устройствах, в) не64-битном симуляторе, и г) 64-битном симуляторе? И оба b и d демонстрируют такое поведение, а a и c — нет?   -  person jscs    schedule 06.01.2014
comment
Я тестировал как на симуляторе, так и на не64-битных устройствах, но не на 64-битном устройстве, к которому у меня сейчас нет доступа. Мне удалось получить такое поведение только на 64-битном симуляторе, но я не знаю, произойдет ли это на реальном устройстве или нет.   -  person Radrider33    schedule 06.01.2014
comment
Круто, спасибо за разъяснение.   -  person jscs    schedule 06.01.2014


Ответы (1)


Вполне вероятно, что ваше устройство ARM64 имеет настройку локали, из-за которой запятая обрабатывается как десятичная дробь или просто как нечисловой текст.

В общем, лучше использовать NSNumberFormatter.

документы Apple на NSNumberFormatter

person Jeff Wolski    schedule 05.01.2014
comment
Я попробую с NSNumberFormatter. Странно то, что это происходит на симуляторе iPhone; Я знаю, что все мои симуляторы настроены на одну и ту же локаль. - person Radrider33; 06.01.2014
comment
Ты знаешь или проверил, @Radrider33? В разных симуляторах могут быть разные настройки форматирования чисел. - person jscs; 06.01.2014
comment
И вы уверены, что в каждом из ваших сценариев есть запятая в строке? - person Jeff Wolski; 06.01.2014