¿Cómo sé cuál es el sistema de medición predeterminado (imperial o métrico) en iOS?


¿Cómo sé cuál es el sistema de medida predeterminado (imperial o métrico) en iOS ?

¿Cómo obtengo esta preferencia de la configuración del dispositivo para saber qué mostrar en mi aplicación ?

Gracias

Author: DaveInCaz, 2011-09-14

6 answers

El NSLocale puede decirte:

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

Solo tres países no utilizan el sistema métrico: Estados Unidos, Liberia y Myanmar. El último utiliza su propio sistema, los dos primeros utilizan Unidades Imperiales.

La documentación de las manzanas dice (énfasis mío):

NSLocaleUsesMetricSystem

La clave para el indicador que indica si la configuración regional utiliza el sistema métrico. El valor correspondiente es un objeto booleano NSNumber. Si el valor es NO, normalmente puede asumir la medición estadounidense unidades (por ejemplo, la milla estatutaria).

Disponible en iOS 2.0 y versiones posteriores.

 71
Author: DarkDust,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-14 08:56:16

Aquí está una versión rápida

var locale = NSLocale.currentLocale()
let isMetric = locale.objectForKey(NSLocaleUsesMetricSystem) as! Bool
 14
Author: nibty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-30 18:14:04

@DarkDust respuesta para swift3

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

//Returns true if the locale uses the metric system 
let isMetric = locale.usesMetricSystem
 14
Author: Nazmul Hasan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-12 06:45:13

Para swift 3

    let locale = NSLocale.current
    let isMetric = locale.usesMetricSystem
 9
Author: GIJOW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-14 14:28:35

Probablemente debería tener una configuración en su aplicación y dejar que sus usuarios elijan this esto es lo que hace Apple en la aplicación del clima.

Si desea elegir un valor predeterminado razonable, puede mirar la configuración regional. Si somos NOSOTROS, elige imperial de lo contrario elige métrica. Es una heurística, a veces estará mal, pero es solo un valor predeterminado que se puede cambiar.

 2
Author: Stephen Darlington,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-14 08:23:59

Como otros mencionados anteriormente, el Reino Unido utiliza una mezcla de unidades métricas e imperiales.

Recomendaría usar el nuevo MeassurementFormatter introducido en iOS 10 que maneja la mayoría de estas discrepancias:

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

Para representar una distancia como una cadena en local, unidad natural, use:

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

Documentación Oficial: https://developer.apple.com/documentation/foundation/measurementformatter

 2
Author: Eneko Alonso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-21 20:04:25