【问题标题】:Getting country name from country code从国家代码中获取国家名称
【发布时间】:2016-06-11 11:43:53
【问题描述】:

我已经找到了 Objective-c 的答案,但我很难迅速做到这一点。

我已经用它来获取当前位置的国家代码:

     let countryCode = NSLocale.currentLocale().objectForKey(NSLocaleCountryCode) as! String
    print(countryCode)
// printing for example US

但是如何将此国家代码转换为国家名称,例如在此示例中将“US”转换为“United States”?

【问题讨论】:

标签: swift location


【解决方案1】:

一个超级干净的 Swift 3 版本应该是:

func countryName(countryCode: String) -> String? {
    let current = Locale(identifier: "en_US")
    return current.localizedString(forRegionCode: countryCode)
}

您可以将语言环境标识符更改为例如。如果您想要本地化名称,则为 Locale.current.identifier。上面的示例仅适用于英语。

【讨论】:

  • 到目前为止,这是 Swift 3 及更高版本的最佳答案。虽然?? nil 毫无意义。
  • 在 Swift 5.1 上完美运行
【解决方案2】:

斯威夫特 3

func countryName(from countryCode: String) -> String {
    if let name = (Locale.current as NSLocale).displayName(forKey: .countryCode, value: countryCode) {
        // Country name was found
        return name
    } else {
        // Country name cannot be found
        return countryCode
    }
}

【讨论】:

  • 在 Swift 3 中不需要使用NSLocale
  • @rmaddy - 然后发布一个不依赖 NSLocale 的替代方案。
  • @RobertGummesson 查看丹尼尔的答案。
  • @rmaddy - 对,错过了那个。 ...我同意你关于 nil 的评论。
【解决方案3】:

尝试做这样的事情:

// get the localized country name (in my case, it's US English)
let englishLocale = Locale.init(identifier: "en_US")

// get the current locale
let currentLocale = Locale.current

var theEnglishName : String? = englishLocale.displayName(forKey: NSLocaleIdentifier, value: currentLocale.localeIdentifier)
if let theEnglishName = theEnglishName
{
    let countryName = theEnglishName.sliceFrom("(", to: ")")
    print("the localized country name is \(countryName)")
}

使用这个辅助函数that I found here:

import Foundation

extension String {
    func sliceFrom(start: String, to: String) -> String? {
        return (rangeOfString(start)?.endIndex).flatMap { sInd in
            (rangeOfString(to, range: sInd..<endIndex)?.startIndex).map { eInd in
                substringWithRange(sInd..<eInd)
            }
        }
    }
}

我通过研究 this related question 发现了这一点。

【讨论】:

  • 这个答案肯定有效,但最重要的是 Swift 4.2 不再具有“sliceFrom”功能。而是像这样使用“replacingOccurrences”:theEnglishName.replacingOccurrences(of: "(", with: "").replacingOccurrences(of: ")", with: "")。 stackoverflow.com/a/53839473/4833705
【解决方案4】:

这是一个紧凑的 swift 4 版本,一直为我工作:

func countryCode(from countryName: String) -> String? {
    return NSLocale.isoCountryCodes.first { (code) -> Bool in
        let name = NSLocale.current.localizedString(forRegionCode: code)
        return name == countryName
    }
}

或者像@Memon 建议的优雅的扩展

extension Locale {

    func countryCode(from countryName: String) -> String? {
        return NSLocale.isoCountryCodes.first { (code) -> Bool in
            let name = self.localizedString(forRegionCode: code)
            return name == countryName
        }
    }

}

【讨论】:

    【解决方案5】:

    试试这个

    let countryLocale : NSLocale =  NSLocale.currentLocale()
                let countryCode  = countryLocale.objectForKey(NSLocaleCountryCode)// as! String
                let country = countryLocale.displayNameForKey(NSLocaleCountryCode, value: countryCode!)
                print("Country Locale:\(countryLocale)  Code:\(countryCode) Name:\(country)")
    

    【讨论】:

      【解决方案6】:

      在 Swift3 上工作

      import Foundation
      
        extension String {
            func sliceFrom(start: String, to: String) -> String? {
                 return (range(of: start)?.upperBound).flatMap({ (sInd) -> String? in
                         (range(of: to, range: sInd..<endIndex)?.lowerBound).map { eInd in
                            substring(with: sInd..<eInd)
               } 
           })
          }
         }   
      

      在应用委托中使用

              let englishLocale : NSLocale = NSLocale.init(localeIdentifier :  "en_US")
      
          // get the current locale
          let currentLocale = NSLocale.current
      
          var theEnglishName : String? = englishLocale.displayName(forKey: NSLocale.Key.identifier, value: currentLocale.identifier)
          if let theEnglishName = theEnglishName
          {
              countryName = theEnglishName.sliceFrom(start: "(", to: ")")
              print("the localized country name is \(countryName)")
          }
      

      【讨论】:

      • 不要在 Swift 3 中使用 NSLocale
      【解决方案7】:

      斯威夫特 4

      struct CountryCode {
          let country: String?
          let code: String
      }
      
      let countries: [CountryCode] = NSLocale.isoCountryCodes.map { 
          let country = (Locale.current as NSLocale).displayName(forKey: .countryCode, value: $0)
          return CountryCode(country: country, code: $0) 
      }
      
      countries.map { print($0) }
      
      // Prints 
      // CountryCode(country: Optional("Ascension Island"), code: "AC")
      // CountryCode(country: Optional("Andorra"), code: "AD")
      // CountryCode(country: Optional("United Arab Emirates"), code: "AE")
      // CountryCode(country: Optional("Afghanistan"), code: "AF")
      

      【讨论】:

      • 不要在 Swift 3 或 4 中使用 NSLocale。丹尼尔的回答显示了正确的解决方案,它在 Swift 4 中运行良好。
      【解决方案8】:

      斯威夫特 3

         let currentLocale : NSLocale = NSLocale.init(localeIdentifier :  NSLocale.current.identifier)
         let countryName : String? = currentLocale.displayName(forKey: NSLocale.Key.countryCode, value: countryCode)
        print(countryName ?? "Invalid country code")
      

      注意:如果你手动输入localIdentifier意味着iOS 8没有列出所有国家名称(例如:“en_US”)

      【讨论】:

      • 真正的 Swift 3 答案将使用 Locale 而不是 NSLocale。
      • 是的,我同意,但是,对于使用 NSLocale 的 IOS 8,如果您使用的是 Locale,则意味着 IOS 8 不会返回正确的响应。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      相关资源
      最近更新 更多