Как создать пользовательскую локаль с пользовательским значением NSDecimalSeparator? - PullRequest
4 голосов
/ 27 августа 2009

У меня проблемы с

+ (NSDecimalNumber *)decimalNumberWithString:(NSString *)numericString locale:(NSDictionary *)locale

Так как я хочу, чтобы программные значения очень высокой точности были получены изначально, чтобы не было ошибок с плавающей запятой, Apple предоставляет мне единственный вариант, чтобы полагаться на шаткий язык.

Итак, в документации написано довольно зашифровано:

Параметры: ... место действия Словарь который определяет локаль (в частности, NSDecimalSeparator) использовать для интерпретировать число в numericString.

Обсуждение Параметр locale определяет, является ли NSDecimalSeparator период (как используется, например, в США) или запятая (как есть используется, например, во Франции).

хорошо, после поиска NSDecimalSeparator в документах ничего не найдено. Поиск в сети, обнаружил, что эта вещь "устарела". Так что в настоящее время я делаю что-то опасное, как это:

NSLocale *usLoc = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
NSDecimalNumber *num = [NSDecimalNumber decimalNumberWithString:str locale:usLoc];

Так что мне интересно: если им действительно нужен этот странный языковой стандарт для чего-то такого важного (я добавляю строки программно, без ввода данных пользователем), не могу ли я как-то создать свой собственный языковой стандарт? Этот параметр хочет NSDictionary, поэтому идея:

Могу ли я создать NSMutableDictionary из этого словаря локали, который поставляется для -initWithLocaleIdentifier: @ "en_US", а затем просто отредактировать этот%? & §! NSDecimalSeparator поле?

И еще одна вещь, которая вызывает у меня головную боль: почему параметр запрашивает NSDictionary, где я должен передать объект NSLocale? Или мой код неверен? (не проверено, так как мое приложение в настоящее время полностью испорчено ;-))

1 Ответ

5 голосов
/ 04 октября 2010

Похоже, нет способа добавить / изменить значения в экземпляре NSLocale; вы можете получить только логическую локаль для пользователя (currentLocale и autoupdatingCurrentLocale), локаль системы без каких-либо изменений, внесенных пользователем в их системных настройках (systemLocale), или любую другую именованную локаль, о которой система знает (initWithLocaleIdentifier).

NSLocale отвечает на сообщение objectForKey:, которое является тем же сообщением, которое используется NSDictionary; Вот почему вы можете использовать NSLocale, хотя метод вызывает NSDictionary. Поскольку NSDecimalNumber, вероятно, будет рассматривать только одно значение, NSDecimalSeparator, у меня есть ощущение, что вы можете избежать создания объекта NSDictionary с этим ключом и передать его в качестве параметра locale, но это может привести к поломке в будущем, поскольку NSDecimalNumber ожидает полноценный экземпляр NSLocale и может быть изменен для проверки других ключей.

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

NSLocale *us = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];

Десятичный разделитель обязательно будет . каждый раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...