NSNumberFormatter is returning garbage data. The variable of interest is milesString at the bottom. It is rounding to 2 instead of 1.6388. I threw in the debugger info and also added the debugging code for testString and num2. For reference, DistanceFormatter is static, not modified anywhere but this function. I've tried replacing it with a local instance to see if the static object was causing the problem (it wasn't). Another note, I got this error when I wasn't using a 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];
}
}
You have allocated, but not initialized the date formatter.
DistanceFormatter = [NSNumberFormatter alloc];
should be
DistanceFormatter = [[NSNumberFormatter alloc] init];
With that change you get the result milesString = @"1.6388"
.