NSDecimalNumber decimalNumberWithString: игнорирует текущий язык

Согласно документации, [NSDecimalNumber decimalNumberWithString:] должен использовать десятичный разделитель locale:

Независимо от того, является ли NSDecimalSeparator периодом (как используется, например, в Соединенных Штатах) или запятой (как используется, например, во Франции), зависит от локали по умолчанию.

Но когда я попробую, этот код:

 NSLog(@"%@", [NSDecimalNumber decimalNumberWithString:@"100,1"]); NSLog(@"%@", [NSDecimalNumber decimalNumberWithString:@"100,1" locale:NSLocale.currentLocale]); 

Дает …

 100 100.1 

… как вывод на iOS 5 и iOS 6. Я пробовал со шведским и французским языками как региональные настройки, так как обе страны используют запятую (,) в качестве разделителя на десятичные числа.

Разве выход не должен быть одинаковым?

(Я знаю, что могу использовать [NSDecimalNumber decimalNumberWithString: locale:], чтобы заставить поведение, поэтому этот вопрос заключается не в поиске альтернативы, просто в том случае, если это ошибка, или я что-то делаю неправильно)

One Solution collect form web for “NSDecimalNumber decimalNumberWithString: игнорирует текущий язык”

NSDecimalNumber – это просто класс хранения данных числового типа. Он запускает парсер (NSNumberFormatter) в строке, которую вы передаете, чтобы создать его номер. Причина, по которой ваш второй оператор журнала работает «лучше», заключается в том, что первый использует языковой стандарт формата по умолчанию ( похоже, что это en_US, но я не могу это проверить, см. Удар по удалению для получения дополнительной информации .) Для синтаксического анализа и «100,1» не является допустимым числом, поэтому часть «non-number» снимается. Указав язык, который использует разделители десятичных чисел, он правильно фиксирует полный номер.

Когда вы NSLog () NSDecimalNumber, это просто вызов -description , который не имеет контекста локали и может печатать, более или менее, независимо от того, что он хочет.

Если вы хотите напечатать правильно отформатированные номера, используйте NSNumberFormatter, например:

 NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"100.1"]; NSLog(@"%@", number); NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; [formatter setNumberStyle:NSNumberFormatterDecimalStyle]; NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"]; [formatter setLocale:locale]; NSLog(@"%@", [formatter stringFromNumber:number]); 

Или, кратко

 NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"100.1"]; NSLog(@"%@", [NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterDecimalStyle]); 

если вы просто хотите использовать текущий язык.

В итоге:

  1. NSDecimalNumber – это просто хранилище. Регистрация в нем не отражает ничего о локали.
  2. Чтобы получить NSDecimalNumber для правильного хранения номера, его языковой стандарт должен соответствовать локали ожидаемого ввода ( -[NSLocale currentLocale] является хорошим выбором здесь).
  3. Чтобы отобразить числа, отформатированные правильно для данного языкового стандарта, используйте NSNumberFormatter.

Редактировать:

Хорошо, я сделал еще несколько исследований по этому вопросу.

В GNUStep похоже, что он заканчивается использованием значения NSDecimalSeparator в NSUserDefaults (из быстрого просмотра их кода).

Проведя некоторые эксперименты, я обнаружил, что ни одно из следующего не влияет на поведение синтаксического анализа по умолчанию, насколько я могу судить:

  1. NSDecimalSeparator в NSUserDefaults .
  2. AppleLocale в NSUserDefaults .
  3. NSLocaleCode в NSUserDefaults .
  4. Значение, установленное для CFBundleDevelopmentRegion .
  5. Значения LANG / LC_ALL / etc … среды.
  6. +[NSLocale systemLocale] .

И, очевидно, это не +[NSLocale currentLocale] , поскольку этот вопрос связан с тем, что текущий язык не имеет никакого эффекта.

  • Преобразование double в NSDecimalNumber при сохранении точности
  • Очень большой идентификатор в JSON, как его получить без потери точности
  • NSDecimal, равное значению NSDecimalNumber?
  • Проверьте, является ли NSDecimalNumber целым числом
  • NSRoundBankers не работает, как описано в Apple
  • Преобразовать строку в NSDecimalNumber
  • Interesting Posts

    Доступ к новым API-интерфейсам iOS 6 для экспонирования камеры и скорости затвора

    Как приложения для обмена сообщениями iOS, такие как Viber, Telegram, WhatsApp, быстро и эффективно выбирают контакты

    Ошибка сбоя сегментации при переходе от SWIFT 2 к SWIFT 3

    Как я могу автоматизировать создание исходного дистрибутива для iPhone-приложения с помощью Xcode?

    Пользовательский пейджинг UIScrollView

    Как установить «верхний» цвет границы на сгруппированные UITableViewCells?

    Содержимое iOS 7 простирается на несколько UITableViewCells

    Разница b / w imageNamed и imageWithContentsOfFile

    OperationQueue.main vs DispatchQueue.main

    «lock» устарел: сначала устарел в iOS 8.0 – Use -performBlockAndWait: вместо этого – iOS coredata warning

    iOS Swift – пользовательский UITableViewCell не работает с панелью вкладок

    возможно ли «разбить» UIViewController и анимировать части в верхней и нижней частях выбранной ячейки

    java.io.IOException: сервер вернул код ответа HTTP: 405 для URL

    Как центрировать горизонтальные ячейки UICollectionView?

    Гео-фехтование с использованием карты Google в iPhone

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.