Ios 地区是否可以通过货币代码识别国家?

Ios 地区是否可以通过货币代码识别国家?,ios,swift,locale,Ios,Swift,Locale,我在这里寻找答案,也在官方文件中,但我找不到答案。我有货币代码(例如“欧元”)。我需要获得国家代码(例如“EU”)。所以我看到我可以做相反的事情(通过使用国家代码获得货币代码),但我试图根据我的需要更改此解决方案,结果得到了零。此外,我知道我可以使用简单的解决方案——从货币代码中删除最后一个字母以获得国家代码(它适用于大多数情况下的API数据,但并非所有情况)——但我觉得这种方法不安全。所以我的问题就像标题中的那个样:我能用语言环境从货币代码中识别国家吗 我的做法如下: 使用NSLocale e

我在这里寻找答案,也在官方文件中,但我找不到答案。我有货币代码(例如“欧元”)。我需要获得国家代码(例如“EU”)。所以我看到我可以做相反的事情(通过使用国家代码获得货币代码),但我试图根据我的需要更改此解决方案,结果得到了零。此外,我知道我可以使用简单的解决方案——从货币代码中删除最后一个字母以获得国家代码(它适用于大多数情况下的API数据,但并非所有情况)——但我觉得这种方法不安全。所以我的问题就像标题中的那个样:我能用语言环境从货币代码中识别国家吗

我的做法如下:

使用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)
    }
}

一种货币可以与多个国家关联,您应该创建自己的自定义数据实现,例如以下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)
}

来自@AamirR的答案有点不准确

  • 欧元!=波兰,波兰=PLN=波兰
  • 美元!=CA,CA=CAD=Canada
在大多数情况下(除某些例外),货币代码的前两个字母=ISO 3166-2国家代码:

  • 印尼国家电力公司=波兰
  • 英镑=英国
  • 美元=美国=美利坚合众国
  • AMD=亚美尼亚
  • 捷克共和国
  • BRL=巴西
等等

因此,如果您有货币代码,您可以获得国家名称(准确率为99%),如下所示:

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

Optional("United States")
然而,正如上面一些评论所述,例如,欧盟不是一个国家,在您的具体案例中,您不需要国旗,您需要“货币国旗”,因此对于欧元,您将显示欧盟国旗,这是正确的,因为您无法确定要显示哪个欧盟国旗-法国、德国等。。。因此,这种方法可能适用于将货币映射到国家标志

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

  • 瑞士法郎=瑞士
  • HRK=克罗地亚
  • 丹麦克朗=丹麦
。。。等等


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

这应该如何工作?例如,欧元是19个不同国家的货币。美元(USD)也是多个国家的货币。“欧盟”不是一个国家。是的,这是正确的。也许我会多解释一点我想要实现的目标。我想获得给定货币的标志-例如,如果您将unicode与EU一起使用,那么您将获得欧盟标志。对于每种货币,我都需要该标志(如果没有,则返回空字符串或nil)。我已经有了为给定regionCode获取此标志的代码,但我必须从货币代码中获取该地区代码我所做的工作,可能大多数显示货币标志的应用程序都是以货币代码命名货币图像。简单。无需尝试将货币代码映射到任何其他代码。有“欧元”货币代码吗?然后加载一个名为“EUR.png”的图像。有“USD”,然后加载“USD.png”。我考虑过这种方法,这是正确的,但我希望,我可以不用额外的文件(比如这个json)就可以做到这一点,在我看来,这将是一种更简单、更优雅的方式。但也许这是不可能的,这将是最好的解决办法。