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];
}
}