У меня есть NSString, который я хочу преобразовать в NSDecimalNumber
. Строка получена с сервера и всегда форматируется с использованием локали en_US
, например XXX.YYY
, а не XXX, YYY
. Я хочу создать NSDecimalNumber
, который принимает XXX.YYY
независимо от языкового стандарта пользователя. Число никогда не отображается пользователю, оно используется для внутренних вычислений.
Обычно вы делаете что-то вроде этого:
NSDecimalNumber *n = [NSDecimalNumber decimalNumberWithString:@"1.234"];
Однако, если пользователь использует локаль fr_FR
Mac OS X, это сломается. en_US
интерпретирует его как одна запятая два три четыре , где - поскольку fr_FR
интерпретирует его как одна тысяча двести тридцать четыре , оба очень разные числа.
Очевидное решение - использовать + decimalNumberWithString: locale:
. Но я не уверен, что передать в качестве аргумента параметру locale:
, который будет работать во всех международных версиях Mac OS X.Я лучше всего предполагаю следующее:
NSLocale *l = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];
NSDecimalNumber *n = [NSDecimalNumber decimalNumberWithString:@"1.234" locale:l];
Это лучший способ сделать это и безопасно ли это? Будет ли локальный идентификатор @ "en_US"
доступен во всех международных версиях Mac OS X или в некоторых случаях он может возвращать nil
NSLocale?
ОБНОВЛЕНИЕ 1: ] Похоже, что это работает хорошо и более четко:
NSDictionary *l = [NSDictionary dictionaryWithObject:@"." forKey:NSLocaleDecimalSeparator];
NSDecimalNumber *n = [NSDecimalNumber decimalNumberWithString:@"1.234" locale:l];
NSLocaleDecimalSeparator
- это константа, определенная для NSLocale, которая отвечает на -objectWithKey:
, точно так же, как NSDictionary. Вы можете использовать любой разделитель десятичных знаков, например @ ","
.
Я думаю, что это, вероятно, лучший ответ на вопрос, если у кого-то есть идея получше?