Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I know which is the default measure system (imperial or metric) on iOS?

People also ask

Does Apple use metric or Imperial?

All replies Apple Watch and your iPhone choose default units (metric or imperial) based on your region.

How do I know if Im Imperial or metric?

Most countries use the metric system which uses the measuring units such as meters and grams, and adds prefixes like kilo, milli, and centi to count orders of magnitude. In the United States, we use the older imperial system, where things are measured in feet, inches, and pounds.


The NSLocale can tell you:

NSLocale *locale = [NSLocale currentLocale]; 
BOOL isMetric = [[locale objectForKey:NSLocaleUsesMetricSystem] boolValue];

Only three countries do not use the metric system: the US, Liberia and Myanmar. The later uses its own system, the former two use Imperial Units.

Apples documentation says (emphasis mine):

NSLocaleUsesMetricSystem

The key for the flag that indicates whether the locale uses the metric system. The corresponding value is a Boolean NSNumber object. If the value is NO, you can typically assume American measurement units (for example, the statute mile).

Available in iOS 2.0 and later.


@DarkDust answer for swift3

//User region setting return
let locale = Locale.current //NSLocale.current

//Returns true if the locale uses the metric system 
let isMetric = locale.usesMetricSystem

here's a swift version

var locale = NSLocale.currentLocale()
let isMetric = locale.objectForKey(NSLocaleUsesMetricSystem) as! Bool

For swift 3

    let locale = NSLocale.current
    let isMetric = locale.usesMetricSystem

As others mentioned before, the UK uses a mix of metric and imperial units.

I would recommend using the new MeassurementFormatter introduced in iOS 10 which handles most of these discrepancies:

import Foundation

let locale = Locale(identifier: "EN_UK")
locale.usesMetricSystem // true!
var formatter = MeasurementFormatter()
formatter.locale = locale
formatter.string(from: Measurement(value: 1000, unit: UnitLength.meters)) // 0.621 mi

To render a distance as a string in local, natural unit, use:

let distanceInMeters: CLLocationDistance = 1000
let formatter = MeasurementFormatter()
formatter.string(from: Measurement(value: distanceInMeters, unit: UnitLength.meters)) // 0.621 mi

Official documentation: https://developer.apple.com/documentation/foundation/measurementformatter


You should probably just have a setting in your app and let your users choose -- this is what Apple does in the Weather app.

If you want to choose a sensible default you could look at the locale. If it's US, pick imperial otherwise choose metric. It is a heuristic, it will be wrong sometimes, but it's just a default that can be changed.