【问题标题】:Swift: Get currency symbol from currency code is not workingSwift:从货币代码获取货币符号不起作用
【发布时间】:2017-09-28 10:44:43
【问题描述】:

我想要货币代码中的货币符号。 例如)欧元 -> 欧元,美元 -> 美元,瑞典克朗 -> 克朗,丹麦克朗 -> 克朗

我正在使用下面的代码来获取货币符号。

func getSymbolForCurrencyCode(code: String) -> String? {
   let locale = NSLocale(localeIdentifier: code)
   return locale.displayName(forKey: NSLocale.Key.currencySymbol, value: code)
}

但是它为 SEK 返回 SEK,为 DKK 返回 DKK,它应该返回 kr。 对于美元、英镑、欧元,它的工作正常。

可能是什么问题?

【问题讨论】:

标签: ios swift


【解决方案1】:

它可以在不使用 NSLocale 类 (Swift 3/4) 的情况下工作:

func getSymbolForCurrencyCode(code: String) -> String? {
    let result = Locale.availableIdentifiers.map { Locale(identifier: $0) }.first { $0.currencyCode == code }
    return result?.currencySymbol
}
getSymbolForCurrencyCode(code: "GBP")

【讨论】:

  • LocaleNSLocale 是相同的。这并不是真正的“没有 NSLocale”。
  • @Sulthan,但据我所知,LocalestructNSLocaleclass,我错了吗?
  • @V.Khambir,你是对的。建议在使用 Swift 时使用 Locale。
  • 这将不必要地遍历所有可用的标识符。您可以只获取第一次出现并从中返回货币代码。 guard let identifier = Locale.availableIdentifiers.first(where: { Locale(identifier: $0).currencyCode == code }) else { return nil } return Locale(identifier: identifier).currencySymbol
  • 顺便说一句,它适用于 SEK -> "kr" 但它也为 DKK 返回 DKK
【解决方案2】:

我已经为添加缓存的字符串创建了两个扩展来优化搜索。

extension String {
    private static let currencyCode = NSCache<NSString, NSString>()

    public var symbolForCurrencyCode: String? {
        if let cached = Self.currencyCode.object(forKey: self as NSString) {
            return cached as String
        }
        let identifiers = Locale.availableIdentifiers
        guard let identifier = identifiers.first(where: { Locale(identifier: $0).currencyCode == self }) else {
            return nil
        }

        guard let symbol = Locale(identifier: identifier).currencySymbol else {
            return nil
        }

        Self.currencyCode.setObject(symbol as NSString, forKey: self as NSString)

        return symbol
    }
}

extension Optional where Wrapped == String {
    public var symbolForCurrencyCode: String? {
        guard let code = self else {
            return nil
        }
        return code.symbolForCurrencyCode
    }
}

"GBP".symbolForCurrencyCode // "£"
"EUR".symbolForCurrencyCode // "€"
"SEK".symbolForCurrencyCode // "kr"

【讨论】:

    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 2012-02-01
    • 2019-08-27
    • 2012-09-04
    相关资源
    最近更新 更多