2011-12-19 8 views
10

Ho due oggetti CLLocation e vorrei mostrare la distanza tra loro in un formato piacevole e carino. Come "22 piedi", "58 yards", o "2.3 miglia"Pretty Print Distances per 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]; 

In sostanza, c'è qualcosa nella biblioteca iOS che può convertire la distanza per una bella stringa o devo farlo manualmente?

risposta

12

Sfortunatamente, è necessario farlo manualmente.

E se lo fate, non dimenticate di controllare:

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

Il resto del mondo avrebbe apprezzato.

+0

Questo non è più vero. Per favore vedi la risposta di Alexander. – xytor

0

È possibile utilizzare la formattazione delle stringhe per raggiungere questo obiettivo:

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

Ma non c'è alcuna funzionalità per la conversione tra le misure di distanza o qualcosa di simile.

42

iOS 7 (e OS X 10.9) ha introdotto MKDistanceFormatter che fa esattamente quello che vi serve:

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

NSString *prettyString = [df stringFromDistance:distance]; 

versione Swift:

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

let prettyString = df.stringFromDistance(distance) 
15

Volevo solo notare che, come con il rilascio di iOS8 ci sarà il nuovo NSFormatters esattamente per questo tipo di problema.

Ci saranno NSLengthFormatter, NSMassFormatter e NSEnergyFormatter che sono molto facili da usare - vedere questo iOS8 NSFormatter tutorial. Ecco un esempio utilizzando il LengthFormatter con rapida:

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

Come con DateFormatter, non sarà più necessariamente utilizzare NSLocale per la stampa l'unità stessa.

+0

Come ha notato Klaas quasi un anno prima di questa risposta, [MKDistanceFormatter] (https://developer.apple.com/library/ios/documentation/MapKit/Reference/MKDistanceFormatter_class/) è stato aggiunto in iOS 7 ed è esattamente adatto per questo scopo. –

+2

'NSLengthFormatter' offre opzioni migliori per la formattazione del valore numerico, mentre non fornisce l'output corretto per le localizzazioni in cui usano il sistema metrico ad eccezione delle distanze. 'MKDistanceFormatter' purtroppo non ti dà opzioni di formattazione numerica e sembra arrotondare il valore numerico. – ThomasW