Ошибка NSNumberFormatter для iOS 3.2? - PullRequest
1 голос
/ 04 ноября 2010

У меня есть код, который я портирую с iOS 4 на iOS 3.2 для демонстрационного проекта на iPad.У меня есть этот код:

+(int) parseInt:(NSString *)str
{
    NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
    [nf setAllowsFloats:NO];
    [nf setMaximum:[NSNumber numberWithInt:INT_MAX]];
    [nf setMinimum:[NSNumber numberWithInt:INT_MIN]];

    @try {
        NSNumber *num = [nf numberFromString:str];
        if (!num)
            @throw [DataParseException exceptionWithDescription:@"the data is not in the correct format."]; 

        return [num intValue];
    }
    @finally {
        [nf release];
    }
}

Это работает затрат на iOS 4, выбрасывая исключения, когда строка (например, дата, с которой у меня проблемы): 1/1/2010

Дляпо какой-то причине, num не равно nil, оно имеет значение 1, в то время как на iOS 4 оно равно nil, как и ожидалось.Первоначально я использовал NSScanner, потому что это было проще, чем NSNumberFormatter, но я столкнулся с той же проблемой, он не анализирует всю строку, только первое число в строке.

IsЕсть что-то, что я могу сделать, чтобы это исправить, или я должен вручную создать анализатор int.Я бы предпочел не использовать подход, основанный на C, но, если понадобится, я это сделаю.

РЕДАКТИРОВАТЬ: я обновил свой код до этого:получить сигнал EXC_BAD_ACCESS, когда я пытаюсь разобрать строку 1/1/2001.Есть идеи?(iOS 4 или выше определена здесь: http://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html)

У меня новая ошибка: когда я анализирую число, оно не точное (точное, поскольку в нем есть несколько десятичных знаковпри использовании того же кода для чисел с плавающей запятой) больше .... как я могу это исправить ?? (я мог бы просто использовать ответ @ joshpaul ...)

Ответы [ 2 ]

4 голосов
/ 04 ноября 2010

Не могу найти что-то конкретное для iOS, но в руководстве по форматированию данных 1002 * есть интересный абзац:

Примечание. До Mac OS v10.6 реализация getObjectValue:forString:errorDescription: возвращала бы YES и значение объекта , даже если только часть строки может быть проанализирована . Это проблематично, потому что вы не можете быть уверены, какая часть строки была проанализирована. Для приложений, связанных с или после Mac OS v10.6, этот метод вместо этого возвращает ошибку, если часть строки не может быть проанализирована. Вы можете использовать getObjectValue:forString:range:error:, чтобы получить старое поведение; этот метод возвращает диапазон подстроки, которая была успешно проанализирована.

Я бы совсем не удивился, если бы numberFromString: был реализован в терминах вышеуказанного метода, а iOS 3.2 NSNumberFormatter основана на 10.5, тогда как версия iOS 4 - 10.6.

Только мое предположение.

Если вы пройдете 01.01.2010 на iOS 3.2, 1 будет проанализирован, а остальные проигнорированы. Вы можете проверить гипотезу, увидев, если вы получаете 2, когда вы проходите 2/1/2010.

Обходным решением может быть использование getObjectValue:forString:range:error:.

1 голос
/ 04 ноября 2010

То есть базовый [str intValue] не работает?Ни, [scanner scanInt:&int]?

А как насчет использования NSCharacterSet, то есть:

NSString *test = [str stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]];
if ([test length]) @throw ...;
return [str intValue];
...