2011-12-19 20 views
10

我有两个CLLocation对象,我希望以很好和漂亮的格式显示它们之间的距离。像“22日脚”,“58.天井”,或“2.3英里”适用于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]; 

但有距离测量或类似的东西之间的转换没有的功能。

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

斯威夫特版本:

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

let prettyString = df.stringFromDistance(distance) 
15

我只是想说明,即,与iOS8的发布会有新的NSFormatters正是这种类型的问题。

将会有NSLengthFormatter,NSMassFormatterNSEnergyFormatter这是非常容易使用 - 见iOS8 NSFormatter tutorial。下面是使用LengthFormatter与SWIFT的例子:

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

像与DateFormatter,您将不再一定要使用NSLocale用于打印单元本身。

+0

正如Klaas在回答这个问题前一年指出的那样,在iOS 7中添加了[MKDistanceFormatter](https://developer.apple.com/library/ios/documentation/MapKit/Reference/MKDistanceFormatter_class/),并且完全适合这个目的。 –

+2

'NSLengthFormatter'为数值的格式提供了更好的选择,而对于使用公制系统除了距离之外的语言环境没有给出正确的输出。 'MKDistanceFormatter'不幸的是不会给你数字格式化选项,并且看起来是围绕数字值。 – ThomasW