Неожиданный вывод в десятичном стиле ios7 NSNumberFormatter

NSNumberFormatter возвращает мусорные данные. Интересующая переменная — milesString внизу. Он округляется до 2 вместо 1,6388. Я добавил информацию об отладчике, а также добавил отладочный код для testString и num2. Для справки, DistanceFormatter является статическим, нигде не модифицируется, кроме этой функции. Я попытался заменить его локальным экземпляром, чтобы увидеть, вызывает ли проблема статический объект (это не так). Еще одно замечание: я получил эту ошибку, когда не использовал roudingMode.

-(NSString *)distanceStringFromLocation:(CLLocation *)location {
    if (!DistanceFormatter) {
        DistanceFormatter = [NSNumberFormatter alloc];
        [DistanceFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
        DistanceFormatter.roundingMode = NSNumberFormatterRoundCeiling;
        DistanceFormatter.minimumFractionDigits = 0;
        DistanceFormatter.maximumFractionDigits = 4;
    }
    CLLocationDistance distance = [_location distanceFromLocation:location];
    distance = distance / 1000;
    NSLocale *locale = [NSLocale currentLocale];
    BOOL isMetric = [[locale objectForKey:NSLocaleUsesMetricSystem] boolValue];
    if (isMetric) {

        return [NSString stringWithFormat:@"%@ kilometers away", [DistanceFormatter stringFromNumber:[NSNumber numberWithFloat:distance]]];
    } else {
        CGFloat miles = 0.621371 * distance; //miles = (CGFloat) 1.63877738
        NSNumber *num = [NSNumber numberWithFloat:miles]; //num = (__NSCFNumber *)(float)1.63878
        NSString *testString = [NSString stringWithFormat:@"%f", miles]; //testString = (__NSCFString *) @"1.63877"
        NSNumber *num2 = [DistanceFormatter numberFromString:testString]; //num2 = (NSNumber *)nil
        NSString *milesString = [DistanceFormatter stringFromNumber:num]; //milesString = (__NSCFString *)@"2"
        return [NSString stringWithFormat:@"%@ miles away", milesString];
    }
}

person Todd Anderson    schedule 18.05.2014    source источник
comment
Не используйте верхний регистр для имен переменных. Зарезервируйте это для имен классов.   -  person Hot Licks    schedule 19.05.2014
comment
Я предпочитаю писать имена статических переменных с большой буквы. Напоминает мне, что они статические, а не переменные экземпляра.   -  person Todd Anderson    schedule 19.05.2014
comment
Как бы то ни было, другим будет труднее читать ваш код.   -  person Hot Licks    schedule 19.05.2014


Ответы (1)


Вы выделили, но не инициализировали средство форматирования даты.

DistanceFormatter = [NSNumberFormatter alloc];

должно быть

DistanceFormatter = [[NSNumberFormatter alloc] init];

С этим изменением вы получите результат milesString = @"1.6388" .

person Martin R    schedule 18.05.2014