2013-03-20 2 views
9

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

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

Но когда я пытаюсь его, этот код:

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

дает ...

100 
100.1 

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

Должно ли не быть выходным?

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

ответ

6

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]); 

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

В итоге:

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

Edit:

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

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

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

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

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

+1

Вопрос не в печати, а о разборе. _ "первый использует языковой формат формата по умолчанию (en_US) для синтаксического анализа" _ - Мой вопрос - почему en_US по умолчанию, когда мой текущий язык - fr_FR. Поэтому, когда в документации указано, что зависит от языка по умолчанию, когда она отличается от en_US, если нет, когда мой текущий язык - fr_FR? – thejaz

+0

В документации не указано, почему локаль становится «стандартным» языком, хотя похоже, что он может измениться. Моя первоначальная мысль заключалась в том, что это может быть связано со значением, установленным для CFBundleDevelopmentRegion, которое [«Обычно соответствует родному языку автора»] (https://developer.apple.com/library/ios/#documentation/General/Reference /InfoPlistKeyReference/Articles/CoreFoundationKeys.html), но изменение этого значения, похоже, не влияет на какое-либо поведение. Если API или документация неясно, лучше всего сделать [файл радара] (https://bugreport.apple.com). – frozendevil

+0

Я подал документальный радар, который я рекомендую вам дублировать (rdar: // 13520160, http://openradar.appspot.com/radar?id=2878409); Я также добавил немного больше информации к моему ответу. – frozendevil

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