Как преобразовать строку с номером в NSDecimalNumber, который имеет запятую, а не десятичную точку? - PullRequest
14 голосов
/ 01 ноября 2010

У меня есть интерфейс, который дает мне такие номера 0000000012345,78

Итак, я понял, как сделать из них число. Но мне нужно рассчитать с этим числом, и мне действительно нужно десятичное число.

NSNumberFormatter *fmtn = [[NSNumberFormatter alloc] init];
[fmtn setFormatterBehavior:NSNumberFormatterBehavior10_4];
[fmtn setNumberStyle:NSNumberFormatterDecimalStyle];
[fmtn setDecimalSeparator:@","];
NSNumber *test = [fmtn numberFromString:@"0000000012345,78"];

Как я могу сделать свой NSNumber равным NSDecimalNumber?

РЕДАКТИРОВАТЬ: Это код, с которым я закончил:

NSDictionary *localeDict = [NSDictionary dictionaryWithObject:@"," forKey:@"NSDecimalSeparator"];
NSDecimalNumber *test = [[NSDecimalNumber alloc] initWithString:@"00000000012345,78" locale:localeDict];

Как составить словарь локали, нельзя было описать как «хорошо документированный», и мне потребовалось некоторое прибегание к поиску примера.

Этот тоже работал:

NSLocale *deLoc = [[NSLocale alloc] initWithLocaleIdentifier:@"de"];
NSDecimalNumber *testd = [NSDecimalNumber decimalNumberWithString:@"00000000012345,78" locale:deLoc];

Ответы [ 3 ]

39 голосов
/ 10 мая 2012

Чтобы преобразовать NSNumber в NSDecimalNumber, не имеет ли больше смысла избегать представления символов вместе с этим кодом?

NSNumber* source = ...;

NSDecimalNumber* result = [NSDecimalNumber decimalNumberWithDecimal:[source decimalValue]]; 
1 голос
/ 01 ноября 2010

Если вы посмотрите NSDecimal Class Reference , вы увидите, что вы можете создавать новые NSDecimalNumber s из NSString s (с и без локали), фактические числа и т. Д.

Если вы хотите преобразовать NSNumber в NSDecimalNumber, вы можете сделать что-то вроде этого:

NSDictionary *locale = ...;
NSNumber *number = ...;
NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithString:[number descriptionWithLocale:locale] locale:locale];

Конечно, вам нужно будет правильно создать локаль, и такие, но это упражнение оставлено на ваше усмотрение (может быть полезно проверить ссылку на класс NSNumber , ссылку на класс NSLocale и Руководство по программированию локалей ).

1 голос
/ 01 ноября 2010
[NSDecimalNumber decimalNumberWithString:@"0000000012345,78"];

Будьте осторожны с локалью;если вы запустите этот код на iPhone, формат региона которого не установлен на французский, он может не вернуть того, что вы ожидаете.Поэтому вы можете использовать:

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

вместо.

...