NSString в NSNumber с некоторым десятичным разделителем

Приложение, которое я создаю, теперь имеет возможность «загружать» текстовые файлы и получать оттуда числа. В симуляторе все работает идеально, но когда я тестировал его на устройстве, он просто вылетал. Через некоторое время я понял, что проблема была с десятичными разделителями. В этом файле я использовал ., а локальные настройки моего iPhone требуют ,. Пример этой строки:

Product 1;100.00
Product 2;82.85
Product 3;95.12
//etc...

После изменения первых нескольких . на , я смог успешно запустить приложение, пока оно не достигло первого ., вот в чем проблема.

Я могу легко заменить все . на , программно, НО я хочу, чтобы это приложение работало в любой стране с любым числовым форматом и не ограничивало его каким-то конкретным рынком.

Код, который я использовал для получения этих чисел:

NSString *fileContents = [[NSUserDefaults standardUserDefaults]objectForKey:theKey];
NSArray *allLinedStrings = [fileContents componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
NSMutableArray *allStringNormalized = [NSMutableArray array];
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
for (int i = 0; i < allLinedStrings.count; i++) {
    NSString *bla = [allLinedStrings objectAtIndex:i];
    NSArray *bla1 = [bla componentsSeparatedByString:@";"];
    [allStringNormalized addObject:[formatter numberFromString:[bla1 objectAtIndex:1]]];
}
self.values = [NSArray arrayWithArray:allStringNormalized];

Любая помощь будет оценена по достоинству.

Спасибо :)


person Novarg    schedule 20.03.2012    source источник


Ответы (1)


Если я правильно понимаю проблему, вы хотите, чтобы NSNumberFormatter всегда использовал . в качестве десятичного разделителя, независимо от локали телефона. Решение этой проблемы простое: используйте методы экземпляра setDecimalSeparator: и setCurrencyDecimalSeparator: из NSNumberFormatter, чтобы установить десятичный разделитель на ..

Обратите внимание, что вам не нужно устанавливать оба десятичных разделителя. Вы используете setDecimalSeparator:, если ваш numberStyle равен NSNumberFormatterDecimalStyle, и setCurrencyDecimalSeparator:, если ваш numberStyle равен NSNumberFormatterCurrencyStyle.

См. документацию для более подробной информации.

person freespace    schedule 20.03.2012
comment
спасибо, это почти то, что я искал. Хотя я надеялся найти способ использовать разные разделители (в случае, если одна строка использует ., а другие используют ,) - person Novarg; 20.03.2012
comment
Вы можете запустить автоматическое определение файла. Если вы знаете, либо это будет . или , затем просто посмотрите, какой из них присутствует, и используйте его. - person freespace; 20.03.2012