Какой аргумент локали передать NSDecimalNumber + decimalNumberWithString: locale: чтобы он всегда работал с NSString, использующими десятичную метку точки (.)? - PullRequest
7 голосов
/ 24 октября 2011

У меня есть строка 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 в некоторых случаях?


UPDATE 1: Thisкажется, работает хорошо, и является более явным:

NSDictionary    *l = [NSDictionary dictionaryWithObject:@"." forKey:NSLocaleDecimalSeparator];
NSDecimalNumber *n = [NSDecimalNumber decimalNumberWithString:@"1.234" locale:l];

NSLocaleDecimalSeparator является константой, определенной для NSLocale, которая отвечает на -objectWithKey:, так же, как NSDictionary.Вы можете использовать любой разделитель десятичных разрядов, например, @",".

Я думаю, что это, вероятно, лучший ответ на вопрос, разве у кого-то есть идея получше?

1 Ответ

7 голосов
/ 26 октября 2011

Это, кажется, работает хорошо, и является более явным:

NSDictionary    *l = [NSDictionary dictionaryWithObject:@"." forKey:NSLocaleDecimalSeparator];
NSDecimalNumber *n = [NSDecimalNumber decimalNumberWithString:@"1.234" locale:l];

NSLocaleDecimalSeparator - это константа, определенная для NSLocale, которая отвечает на -objectWithKey:, так же, как NSDictionary. Вы можете использовать любой разделитель десятичных знаков, например @",".

.

Я думаю, что это, вероятно, лучший ответ на вопрос, разве у кого-то есть идея получше?

...