为什么 NSLocale.current.identifier 在 macOS 上包含货币?

Why does NSLocale.current.identifier include currency on macOS?

如果我在 iOS 上请求当前区域设置标识符,它 returns 只是标识符字符串:

let identifier = NSLocale.current.identifier // en_GB

然而,在 macOS 10.12.2 上它也 returns 货币:

let identifier = NSLocale.current.identifier // en_GB@currency=GBP

这是错误还是预期行为?

我认为对我来说最好的选择是自己生成代码。为了解决这个问题,我在 Locale:

上创建了一个扩展
extension Locale {
    var iso3166code: String {
        guard
            let language = languageCode,
            let region = regionCode
            else { return "en-US" }
        return "\(language)-\(region)"
    }
}

虽然这对我的目的来说足够准确,但您可能应该确保它 returns 是您项目的预期值。

我最近 运行 喜欢这个。我不确定为什么,但显然从 10.12 开始,localeIdentifier can include a bunch of stuff besides country and language.

遗憾的是,文档没有详细说明包含其他元数据的情况。

但是,从 10.12 开始,还有另一个 属性 languageCode, which, in conjunction with countryCode,您可以使用它来生成 en_US

这就是iTerm2 does