如何使用ISO国家代码(2个字母)查找区域标识符?

3
在我的应用程序中,我希望根据用户所查看的国家/地区来显示正确的货币代码:
var isoCountryCode = "GB"
    
let currency = Locale(identifier: isoCountryCode).currency?.identifier ?? "GBP"

因此,我想要用一个变量代替硬编码的“GB”,这个变量使用ISOCountryCode来确定区域标识符。例如,对于英国,它的两位字母ISO国家代码为GB,则结果将是“en_GB”。

或者,如果有更简单的方法可以使用国家代码来确定本地货币,我同样会很高兴。

2个回答

3
我在这里找到了答案:

swift get currencycode from country code

。代码有些过时,更新后的代码如下:
let components: [String: String] = [NSLocale.Key.countryCode.rawValue: isoCountryCode]
    
let identifier = NSLocale.localeIdentifier(fromComponents: components)
    
let locale = NSLocale(localeIdentifier: identifier)
    
let currencyCode = locale.object(forKey: NSLocale.Key.currencyCode)

2
你假设一个地区内的每个语言群体都使用相同的货币。这确实是真实的,但不能保证(人类非常不一致)。但事实确实如此,所以我们可以利用这一点。
首先,让我们证明目前确实如此,这样你就可以检测它是否为真。为了做到这一点,创建所有的语言环境(这是一个你以后需要尝试的技巧,值得一试)。
let locales = Locale.availableIdentifiers.map(Locale.init(identifier:))

现在,将每个地区映射到该地区使用的每种货币:
let currencies = Dictionary(grouping: locales,
                            by: { $0.region?.identifier ?? ""})
    .mapValues { $0.compactMap { $0.currency?.identifier }}

这个的输出结果是按照以下模式排列的:
["BZ": ["BZD", "BZD"], "MR": ["MRU", "MRU", "MRU", "MRU"], ...

那么问题是:是否有一些地区使用多种货币?
let allMatch = currencies.values
    .filter { list in !list.allSatisfy { $0 == list.first }}
    .isEmpty  // true

很好。这个假设似乎可行。我们可以在一个拥有货币的地区中选择任意一种随机语言,该货币应该是该地区的货币。


既然可以随便选一种语言,那就这么做吧:

let isoCountryCode = "GB"

let locale = Locale.availableIdentifiers.lazy
    .map(Locale.init(identifier:))
    .first(where: { $0.region?.identifier == isoCountryCode && $0.currency != nil })

locale?.currency?.identifier  // "GBP"

顺便说一下,我的机器选择了康沃尔语(kw)作为语言,而不是英语,但这没关系。假设任何地区语言都有相同的货币。


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