Простой способ ввести десятичное число в виде строки в NSDecimalNumber? - PullRequest
1 голос
/ 26 августа 2009

Читая документацию, я должен был бы сделать что-то ужасное:

NSLocale *usLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"0.00001" locale:usLocale];

Но: разве нет лучшего способа сообщить классу NSDecimalNumber, что нужно искать точку (.), А не что-нибудь еще? Места кажутся мне небезопасными. Что если однажды новый президент сочтет, что так круто изменить символ периода с . на , ? Тогда мое приложение вылетает. Конечно, этого не произойдет. Но есть небольшой шанс, что это возможно. Хватит меня пугать, используя для этого локаль; -)

Есть идеи? Или это мой единственный вариант? И если это единственный вариант: правильный ли подход выше? Или есть еще лучший?

И: Если я получу это право, объект NSDecimalNumber прочитает эту строку, проанализирует ее и создаст из нее значения мантиссы, экспоненты и isNegative для внутреннего использования, верно?

РЕДАКТИРОВАТЬ: я должен был упомянуть, что я добавляю эти значения программно / вручную (в моем коде), они не вводятся пользователем.

Ответы [ 3 ]

2 голосов
/ 26 августа 2009

Указание локали необходимо только в том случае, если вы передаете строку, которая не является допустимым десятичным числом в локали по умолчанию.Если ваши пользователи создают строки, весьма вероятно, что они отформатируют их должным образом для используемой локали.

Использование локалей намного безопаснее, чем их отсутствие.Пытаюсь разобрать "."из "1,50" вряд ли удастся.

И учитывая, что

[NSDecimalNumber decimalNumberWithString:@"0.00001" locale:usLocale]

описывается в документах как

Создает и возвращаетNSDecimalNumber объект, значение которого эквивалентно значению в данной числовой строке.

Я думаю, что это безопасная ставка, что он создает и возвращает NSDecimalNumber, значение которого эквивалентно значению строки.

1 голос
/ 26 августа 2009

Места это хорошая вещь; если бы президент изменил десятичную точку с . на ,, языковой стандарт en_US будет обновлен в следующем выпуске ОС - вы явно не упоминаете десятичную точку языкового стандарта в приведенном выше коде, так что ты в порядке там. При этом вы, возможно, захотите получить системный языковой стандарт вместо явного указания en_US, что будет неверно в любом месте за пределами США.

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

И да, если вы все сделаете правильно, результатом будет объект NSDecimalNumber, значение которого эквивалентно строке, которую вы передали.

0 голосов
/ 26 августа 2009

Места это хорошая вещь. Изменяемые локали, применяемые к статическим внутренним данным, - это плохая вещь, и вы правы (если, возможно, параноидально): D) беспокоиться о применении локали к данным, которые вы (а не пользователь) предоставляете. Вот некоторые решения, которые не основаны на применении локалей к вашим внутренним данным.

number = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:-5 isNegative:NO];
number = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:0.00001] decimalValue];

Второе было бы очень легко превратить в категорию NSDecimalNumber, реализующую -decimalNumberWithDouble:. Наверное, весьма полезно.

...