NSDecimalNumber - это просто класс хранения данных типа num. Он запускает парсер (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]);
, если вы просто хотите использовать текущую локаль.
В итоге:
- NSDecimalNumber только для хранения. Регистрация в нем не отражает ничего о локали.
- Чтобы получить NSDecimalNumber для правильного хранения номера, его языковой стандарт должен соответствовать языку ожидаемого ввода (
-[NSLocale currentLocale]
- хороший выбор здесь).
- Для отображения чисел, отформатированных правильно для данного языкового стандарта, используйте NSNumberFormatter.
Edit:
Хорошо, я сделал некоторые дополнительные исследования по этому вопросу.
В GNUStep, похоже, что оно заканчивается тем, что используется для NSDecimalSeparator
в NSUserDefaults
(из быстрого обзора их кода).
Выполнение некоторых экспериментов я обнаружил, что ни один из перечисленных ниже не влияют на поведение синтаксического анализа по умолчанию, насколько я могу сказать:
NSDecimalSeparator
в NSUserDefaults
.
AppleLocale
в NSUserDefaults
.
NSLocaleCode
в NSUserDefaults
.
- Значение, установленное для
CFBundleDevelopmentRegion
.
- Окружающая среда
LANG
/LC_ALL
/etc ... значения.
+[NSLocale systemLocale]
.
И, очевидно, это не +[NSLocale currentLocale]
, так как этот вопрос связан с тем, что текущий язык не имеет никакого эффекта.
Вопрос не в печати, а о разборе. _ "первый использует языковой формат формата по умолчанию (en_US) для синтаксического анализа" _ - Мой вопрос - почему en_US по умолчанию, когда мой текущий язык - fr_FR. Поэтому, когда в документации указано, что зависит от языка по умолчанию, когда она отличается от en_US, если нет, когда мой текущий язык - fr_FR? – thejaz
В документации не указано, почему локаль становится «стандартным» языком, хотя похоже, что он может измениться. Моя первоначальная мысль заключалась в том, что это может быть связано со значением, установленным для CFBundleDevelopmentRegion, которое [«Обычно соответствует родному языку автора»] (https://developer.apple.com/library/ios/#documentation/General/Reference /InfoPlistKeyReference/Articles/CoreFoundationKeys.html), но изменение этого значения, похоже, не влияет на какое-либо поведение. Если API или документация неясно, лучше всего сделать [файл радара] (https://bugreport.apple.com). – frozendevil
Я подал документальный радар, который я рекомендую вам дублировать (rdar: // 13520160, http://openradar.appspot.com/radar?id=2878409); Я также добавил немного больше информации к моему ответу. – frozendevil