语言环境可以通过货币代码识别国家吗?

时间:2019-05-04 09:36:49

标签: ios swift locale

我在这里以及官方文档中都在寻找答案,但是我找不到答案。我有货币代码(例如“ EUR”)。我需要输入国家/地区代码(例如“ EU”)。因此,我已经看到可以反向执行此操作(通过使用国家/地区代码来获取货币代码),但是我试图根据自己的需要更改此解决方案,结果得到的结果为零。我也知道我可以使用简单的解决方案-从货币代码中删除最后一个字母以获取国家/地区代码(大多数情况下可以从我的API数据中使用,但并非在所有地方都可以使用)-但我觉得这种方法并不安全。所以我的问题就像标题中一样:我可以使用Locale从货币代码中识别国家吗?

这是我的方法:

使用NSLocale

extension NSLocale {

   static func currencySymbolFromCode(code: String) -> String? {
      let localeIdentifier = NSLocale.localeIdentifier(fromComponents: [NSLocale.Key.currencyCode.rawValue : code])
      let locale = NSLocale(localeIdentifier: localeIdentifier)
      return locale.object(forKey: NSLocale.Key.countryCode) as? String
}

}

使用语言环境

extension Locale {    
  static let countryCode: [String: String] = Locale.isoCurrencyCodes.reduce(into: [:]) {
        let locale = Locale(identifier: Locale.identifier(fromComponents: [NSLocale.Key.currencyCode.rawValue: $1]))
        $0[$1] = (locale.regionCode)
    }
}

2 个答案:

答案 0 :(得分:1)

一种货币可以与多个国家/地区关联,您应该创建自己的自定义数据实现,例如遵循json

{
"EUR":"PL",
"USD":"CA"
}

在Xcode项目中创建一个文件,并将其命名为data.json,然后粘贴上述JSON,最后使用以下方法

func getCountryCode(currency: String) -> String? {
    var countryCode: String?
    let url = Bundle.main.url(forResource: "data", withExtension: "json")!
    do {
        let data = try Data(contentsOf: url)
        let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: String]
        countryCode = json?[currency]
    } catch {
        print(error.localizedDescription)
    }

    return countryCode
}

用法

if let countryCode = getCountryCode(currency: "EUR") {
    print(countryCode)
}

答案 1 :(得分:-1)

@AamirR 的回答有点不准确。

  • EUR != PL,PL = PLN = 波兰
  • USD != CA,CA = CAD = 加拿大

在大多数情况下(有一些例外),货币代码的前 2 个字母 = ISO 3166-2 国家/地区代码:

  • PLN = PL = 波兰
  • GBP = GB = 英国
  • USD = US = 美国
  • AMD = AM = 亚美尼亚
  • CZK = CZ = 捷克共和国
  • BRL = BR = 巴西

等等......

因此,如果您有货币代码,则可以按如下方式获取国家/地区名称(准确度为 99%):

let currencyCode = "USD"
let countryCode = String(currencyCode.prefix(2))
let countryName = Locale.current.localizedString(forRegionCode: countryCode)
        
print(countryName)

Optional("United States")

然而,正如上面的一些评论,例如,欧盟不是一个国家,在您的特定情况下,您不需要国家标志,您需要“货币标志”,因此对于欧元,您将显示欧盟标志,这是正确的,因为您无法确定要显示哪个欧盟国家/地区国旗 - 法国、德国等......所以这种方法可能适用于将货币映射到国家/地区国旗。

尽管有一些例外,就货币代码的前 2 个字母与国家名称的前 2 个字母不匹配而言,从 ISO 3166-2 国家代码的角度来看,它们仍然匹配:

  • CHF = CH = 瑞士
  • HRK = HR = 克罗地亚
  • 丹麦克朗 = 丹麦克朗 = 丹麦

...等等

另一个有趣的模式是货币代码的前 2 个字母通常与国家互联网域匹配,但同样,也有一些例外。