我在这里以及官方文档中都在寻找答案,但是我找不到答案。我有货币代码(例如“ 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)
}
}
答案 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 的回答有点不准确。
在大多数情况下(有一些例外),货币代码的前 2 个字母 = ISO 3166-2 国家/地区代码:
等等......
因此,如果您有货币代码,则可以按如下方式获取国家/地区名称(准确度为 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 国家代码的角度来看,它们仍然匹配:
...等等
另一个有趣的模式是货币代码的前 2 个字母通常与国家互联网域匹配,但同样,也有一些例外。