2011-12-19 3 views
10

У меня есть два объекта CLLocation, и я хотел бы показать расстояние между ними в хорошем и симпатичном формате. Как «22 футов», «58 ярдов», или «2,3 мили»Pretty Print Расстояния для iOS

CLLocation *location1 = [[CLLocation alloc] initWithLatitude:42.333297 longitude:-71.588858]; 
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:42.353297 longitude:-71.578858]; 

float target = [location1 getDistanceFrom:location2]; 

В принципе, есть что-нибудь в библиотеке IOS, которая может конвертировать расстояние до довольно строки или я должен сделать это вручную?

ответ

12

К сожалению, вы должны сделать это вручную.

И если вы сделаете это, пожалуйста, не забудьте проверить:

[[[NSLocale currentLocale] objectForKey:NSLocaleUsesMetricSystem] boolValue] 

Остальной мир был бы признателен.

+0

Это уже не так. Пожалуйста, см. Ответ Александра. – xytor

0

Вы можете использовать строку форматирования для достижения этой цели:

//distance to 2 decimal places 
NSString *target = [NSString stringWithFormat:@"%.2f miles", distance]; 

Но нет никакой функциональности для преобразования между измерениями расстояния или что-нибудь подобное.

4

TTTLocationFormatter от FormatterKit может быть именно то, что вы ищете. Если это не так, вы можете использовать его в качестве отправной точки.

42

IOS 7 (и OS X 10.9) представил MKDistanceFormatter, что делает именно то, что вам нужно:

CLLocationDistance distance = 1320.0; 
MKDistanceFormatter *df = [[MKDistanceFormatter alloc]init]; 
df.unitStyle = MKDistanceFormatterUnitStyleFull; 

NSString *prettyString = [df stringFromDistance:distance]; 

Swift версия:

let distance = 1320.0 
let df = MKDistanceFormatter() 
df.unitStyle = .Full 

let prettyString = df.stringFromDistance(distance) 
15

Я просто хотел отметить, что, как выпуск iOS8 будет новый NSFormatters для такого рода проблем.

Там будет NSLengthFormatter, NSMassFormatter и NSEnergyFormatter, которые очень просты в использовании - посмотреть iOS8 NSFormatter tutorial. Вот пример использования LengthFormatter с быстрым:

let lengthFormatter = LengthFormatter() 
print("Kilometer: ", lengthFormatter.string(fromValue:1000, unit: .kilometer)) //Kilometer: 1,000 km 

Как с DateFormatter, вы больше не будете обязательно использовать NSLocale для печати самого блока.

+0

Как заметил Клаас почти за год до этого ответа, [MKDistanceFormatter] (https://developer.apple.com/library/ios/documentation/MapKit/Reference/MKDistanceFormatter_class/) был добавлен в iOS 7 и подходит именно для этого цель. –

+2

'NSLengthFormatter' предоставляет лучшие параметры для форматирования численного значения, но не дает правильного вывода для локалей, где они используют метрическую систему, за исключением расстояний. «MKDistanceFormatter», к сожалению, не дает вам числовых параметров форматирования и появляется вокруг численного значения. – ThomasW