During the localization of my app I went through a lot of documentation, somewhere Im sure I read that there is a way to get a set of units that is linked with the locale.
I believe it said something like "units based on cultural..." something.
I would like to display temperature and distance in Fahrenheit and Miles for some countries and Celsius and Kilometers for other countries.
Is there a way to access a list of these units in the iPhone SDK.
Thanks you.
You can use NSLocale
to check the currency unit, but for imperial vs. metric you need to make a list yourself.
Oops. You can check for the imperial vs. metric. There is are NSLocaleMeasurementSystem
and NSLocaleUsesMetricSystem
keys.
It is worth mentioning that Apple provides a nice library (MKDistanceFormatter, introduced in iOS 7) to automatically present a CLLocationDistance as the appropriate string for a given user's locale and language.
It does a little fuzzy rounding (e.g. 300ft->350ft->400ft), but does nicely convert between units (e.g. feet -> miles, when appropriate to do so). Unless you demand really precise values, this class is perfect for returning rough estimates for distances in two lines of code.
MKDistanceFormatter *distanceFormatter = [[MKDistanceFormatter alloc] init];
[distanceFormatter setUnitStyle:MKDistanceFormatterUnitStyleAbbreviated]; // Optional
NSString *formattedDistance = [distanceFormatter stringFromDistance:100];
NSLog(@"%@",formattedDistance); // Prints "350 ft"
I just wanted to note, that, as with the release of iOS8 there will be new NSFormatters
for at least some of the units you mentioned.
There will be NSLengthFormatter
, NSMassFormatter
and NSEnergyFormatter
which are very easy to use – see this iOS8 NSFormatter tutorial. Here is an example using the NSLengthFormatter with swift:
let lengthFormatter = NSLengthFormatter()
println(@"Kilometer: %@", lengthFormatter.stringFromValue(1000, unit: .Kilometer)) //Kilometer: 1,000 km
Swift:
1.)
import MapKit
2.) Since creating formatter is expensive, you better set formatter as a lazy property. By doing so, you can initialize the formatter only when it's necessary and reuse the formatter rather than create a new one.
lazy var distanceFormatter: MKDistanceFormatter = {
var tempDistanceFormatter = MKDistanceFormatter()
tempDistanceFormatter.unitStyle = .Abbreviated // .abbreviated in Swift 3
return tempDistanceFormatter
}()
3.)
let distanceString = self.distanceFormatter.stringFromDistance(yourDistance)
I have extracted this method to String extension. Looks elegant
Swift 4.1 version
import MapKit
extension String {
init(distance: Double ) {
let mkDistanceFormatter = MKDistanceFormatter()
mkDistanceFormatter.unitStyle = .abbreviated
self = mkDistanceFormatter.string(fromDistance: distance)
}
}
Usage
let distance = Double(34234.0)
let stringDistance String(distance:distance)
来源:https://stackoverflow.com/questions/2153302/finding-the-distance-currency-temperature-units-etc-for-a-country-iphone