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] , поскольку этот вопрос связан с тем, что текущий язык не имеет никакого эффекта.

  • Преобразовать строку в NSDecimalNumber
  • мы можем преобразовать NSDecimal значения в UIImage?
  • NSDecimalNumber для NSDecimalNumber
  • NSDecimalNumber нулей после десятичной точки (iPhone SDK)
  • Установка NSDecimalNumber и получение значения
  • Различные способы сравнения NSDecimalNumber
  • NSDecimalNumber sum
  • неправильный десятичный разделитель с NSDecimalNumber в iOS
  • Округление issus insert NSDecimalNumber в Sqlite
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.