我该如何知道iOS上的默认度量系统(英制或公制)?

61

我如何知道iOS上默认的度量系统是英制还是公制?

我如何从设备设置中获取此首选项,以便知道在我的应用程序中显示什么?

谢谢

8个回答

86

NSLocale 可以告诉你:

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

仅有三个国家不使用公制系统:美国、利比里亚和缅甸。后者使用自己的系统,前两者使用英制单位。

苹果的文档中提到(我的强调):

NSLocaleUsesMetricSystem

指示区域设置是否使用公制系统的标志的键。 相应的值是一个布尔NSNumber对象。如果该值为NO,则通常可以假定使用美国的计量单位(例如英里)。

iOS 2.0及以后版本可用。


7
注意:英国使用公制和英制的混合计量单位。重量通常用千克来衡量,但距离(特别是在道路上)仍然以英里为单位。 - James Webster
@DarkDust 谢谢,这确实是一个解决方案。我现在唯一的问题是,如果用户在iPad首选项中更改了语言环境设置,并在多任务处理中运行我的应用程序,该如何更新我的应用程序中的设置。我只能在viewDidAppear中检查它,但是否有更好的解决方案? - aneuryzm
1
@Patrick:在 UIApplicationDelegateapplicationDidBecomeActive: 方法中进行检查(或订阅相应的通知 UIApplicationDidBecomeActiveNotification),和/或者订阅 NSCurrentLocaleDidChangeNotification 通知。 - DarkDust
@JamesWebster 对于称量人体重,许多英国人仍然使用“stones”(石头),据我所知这种单位在世界其他地方并没有被广泛使用。 - lewis

42

@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

14

这里是一个 Swift 版本

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

2
谢谢!对于Swift 2,将是:let locale = NSLocale.currentLocale() - Lucas

14

对于 Swift 3

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

但仅适用于iOS 10及以上版本;对我来说不清楚如何在目标为iOS 9的Swift 3应用程序中实现此功能。 - JLundell
5
Locale.current.usesMetricSystem еңЁ iOS 9 дёӯиҝҗиЎҢиүҜеҘҪгҖӮ - Graham Perks

6

正如其他人之前提到的那样,英国使用公制和英制混合计量单位。

我建议使用在iOS 10中引入的新MeassurementFormatter,它可以处理大多数这些差异:

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

这是有关于it技术的测量格式化器。


5
// Before iOS 16
Locale.current.usesMetricSystem

// iOS 16 and up
Locale.current.measurementSystem == .metric

usesMetricSystem 在 iOS 16 上已被弃用。


4

你的应用程序应该提供一个设置选项,让用户自己选择。这就是苹果天气应用程序所做的。

如果你想选择一个合理的默认单位,可以查看地区设置。如果是美国,则选择英制单位,否则选择公制单位。这是一种启发式方法,有时会出现错误,但它只是一个可以更改的默认值。


我正在尝试做到这一点。我有一个视图控制器,应该显示单位系统(厘米/英尺和英寸),并在两者之间进行转换。我已经创建了一个带有切换开关的设置包(关闭:公制/打开:英制,默认值:关闭)。当我第一次启动应用程序时,它可以正常工作。但是,如果我改变为英制,那个更改会生效,但是再次改回关闭(->公制)就没有任何效果。有什么想法吗? - coernel

-1
你可以为你的Locale添加一个扩展,以便更方便地访问:
extension Locale {
    static func metricsSystem() -> Bool {
        current.measurementSystem == .metric
    }
}

然后称之为:
let isMetric = Locale.metricsSystem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接