Как узнать, какая система мер по умолчанию (имперская или метрическая) в iOS?

Как узнать, какая система измерения по умолчанию (имперская или метрическая) в iOS ?

Как получить это предпочтение из настроек устройства, чтобы я знал, что отображать в моем приложении ?

спасибо

6 ответов


на NSLocale могу тебе сказать:

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

только три страны не используют метрическую систему: США, Либерия и Мьянма. Более поздние используют свою собственную систему, первые два используют имперские единицы.

яблоки документация говорит (выделено мной):

NSLocaleUsesMetricSystem

ключ для флага, указывающего, использует ли локаль метрическую систему. Соответствующее значение NSNumber объект boolean. если значение-Нет, вы обычно могут принимать американские единицы измерения (например, статутная миля).

доступно в iOS 2.0 и более поздних версиях.


вот быстрая версия

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

@DarkDust ответ для swift3

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

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

для swift 3

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

вы, вероятно, просто должны иметь настройку в своем приложении и позволить своим пользователям выбирать-это то, что Apple делает в приложении Weather.

Если вы хотите выбрать разумное значение по умолчанию, вы можете посмотреть на локаль. Если это мы, выберите imperial в противном случае выберите metric. Это эвристика, иногда это будет неправильно, но это просто дефолт, который можно изменить.


как уже упоминалось ранее, Великобритания использует сочетание метрических и имперских единиц.

Я бы рекомендовал использовать новый тег MeassurementFormatter введено в iOS 10, который обрабатывает большинство этих несоответствий:

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

чтобы отобразить расстояние в виде строки в локальной, естественной единице, используйте:

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

официальная документация:https://developer.apple.com/documentation/foundation/measurementformatter