Получить символ валюты на основе кода страны или названия страны, используя NSLocale

Я хочу отобразить символ валюты на основе названия страны или кода страны, используя NSLocale. У меня есть весь список названий стран. Предположим, что я выбрал США, тогда он возвращает $ Валюта

Код:

 NSLocale *locale = [NSLocale currentLocale];
 NSString *countryCode = [locale objectForKey: NSLocaleCountryCode];
 NSString *country = [locale displayNameForKey: NSLocaleCurrencyCode value: countryCode];

4 ответа

Решение

Вы можете создать свой собственный список кодов стран и символа валюты этой страны, используя следующий код:

Objective-C:

- (void)listCountriesAndCurrencies {
    NSArray<NSString *> *localeIds = [NSLocale availableLocaleIdentifiers];
    NSMutableDictionary<NSString *, NSString *> *countryCurrency = [NSMutableDictionary dictionary];
    for (NSString *localeId in localeIds) {
        NSLocale *locale = [NSLocale localeWithLocaleIdentifier:localeId];

        NSString *country = [locale objectForKey: NSLocaleCountryCode];
        if (country && country.length == 2) {
            NSString *currency = [locale objectForKey: NSLocaleCurrencySymbol];
            countryCurrency[country] = currency;
        }
    }

    NSArray<NSString *> *sorted = [countryCurrency.allKeys sortedArrayUsingSelector:@selector(compare:)];
    for (NSString *country in sorted) {
        NSString *currency = countryCurrency[country];

        NSLog(@"country: %@, currency: %@", country, currency);
    }
}

Этот код начинается со списка всех идентификаторов локали. Оттуда он создает каждый связанный NSLocale, Для каждой локали извлекается код страны и символ валюты. Они используются для создания словаря кодов стран и символов валюты, которые затем распечатываются.

Вот тот же код, переведенный в Swift 3:

func listCountriesAndCurrencies() {
    let localeIds = Locale.availableIdentifiers
    var countryCurrency = [String: String]()
    for localeId in localeIds {
        let locale = Locale(identifier: localeId)

        if let country = locale.regionCode, country.characters.count == 2 {
            if let currency = locale.currencySymbol {
                countryCurrency[country] = currency
            }
        }
    }

    let sorted = countryCurrency.keys.sorted()
    for country in sorted {
        let currency = countryCurrency[country]!

        print("country: \(country), currency: \(currency)")
    }
}

Это приводит к следующему списку при запуске на смоделированном устройстве iOS 10:

страна: AD, валюта: € страна: AE, валюта: د.إ. страна: AF, валюта: ؋ страна: AG, валюта: $ страна: AI, валюта: $ страна: AL, валюта: Lekë страна: AM, Валюта: ֏ страна: AO, валюта: Kz страна: AR, валюта: $ страна: AS, валюта: $ страна: AT, валюта: € страна: AU, валюта: $ страна: AW, валюта: Afl. страна: AX, валюта: € страна: AZ, валюта: ₼ страна: BA, валюта: страна KM: BB, валюта: $ страна: BD, валюта: ৳ страна: BE, валюта: € страна: BF, валюта: страна CFA: BG, валюта: лв. страна: BH, валюта: د.ب. страна: BI, валюта: FBu страна: BJ, валюта: CFA страна: BL, валюта: € страна: BM, валюта: $ страна: BN, валюта: $ страна: BO, валюта: страна Bs: BQ, валюта: страна $: BR, валюта: страна R$: BS, валюта: страна $: BT, валюта: Nu. страна: BW, валюта: P страна: BY, валюта: р. страна: BZ, валюта: $ страна: CA, валюта: $ страна: CC, валюта: $ страна: CD, валюта: страна FC: CF, валюта: страна FCFA: CG, валюта: страна FCFA: CH, валюта: страна CHF: CI, валюта: страна CFA: CK, валюта: страна $: CL, валюта: страна $: CM, валюта: страна FCFA: CN, валюта: ¥ страна: CO, валюта: страна $: CR, валюта: ₡ страна: CU, валюта: $ страна: CV, валюта: страна: CW, валюта: NAf. страна: CX, валюта: $ страна: CY, валюта: € страна: CZ, валюта: Kč страна: DE, валюта: € страна: DG, валюта: US$ страна: DJ, валюта: Fdj страна: DK, валюта: kr, страна: DM, валюта: $ страна: DO, валюта: RD$ страна: DZ, валюта: د.ج. страна: EA, валюта: € страна: EC, валюта: $ страна: EE, валюта: € страна: EG, валюта: ج.م. страна: EH, валюта: د.م. страна: ER, валюта: Nfk страна: ES, валюта: € страна: ET, валюта: Br страна: FI, валюта: € страна: FJ, валюта: страна $: FK, валюта: страна £: FM, валюта: страна доллара США: FO, валюта: страна kr: FR, валюта: страна €: GA, валюта: страна FCFA: GB, валюта: страна £: GD, валюта: $ страна: GE, валюта: ₾ страна: GF, валюта: € страна: GG, валюта: £ страна: GH, валюта: GH₵ страна: GI, валюта: £ страна: GL, валюта: кр. страна: GM, валюта: D страна: GN, валюта: FG страна: GP, валюта: € страна: GQ, валюта: FCFA страна: GR, валюта: € страна: GT, валюта: Q страна: GU, валюта: $ страна: GW, валюта: страна CFA: GY, валюта: страна $: HK, валюта: страна HK$: HN, валюта: страна L: HR, валюта: страна HRK: HT, валюта: страна G: HU, валюта: страна HUF: IC, валюта: € страна: ID, валюта: Rp страна: IE, валюта: € страна: IL, валюта: ₪ страна: IM, валюта: £ страна: IN, валюта: ₹ страна: IO, валюта: страна US $: IQ, валюта: IQD страна: IR, валюта: IRR страна: IS, валюта: ISK страна: IT, валюта: € страна: JE, валюта: £ страна: JM, валюта: $ страна: JO, валюта: د.أ. Страна: JP, валюта: ¥ страна: KE, валюта: Ksh страна: KG, валюта: сом страна: KH, валюта: ៛ страна: KI, валюта: $ страна: KM, валюта: CF страна: KN, валюта: $ страна: KP, валюта: KPW страна: KR, валюта: ₩ страна: KW, куб. валюта: د.ك. страна: KY, валюта: $ страна: KZ, валюта: ₸ страна: LA, валюта: ₭ страна: LB, валюта: ل.ل. страна: LC, валюта: $ страна: LI, Валюта: CHF Страна: LK, Валюта: Rs. страна: LR, валюта: $ страна: LS, валюта: R страна: LT, валюта: € страна: LU, валюта: € страна: LV, валюта: € страна: LY, валюта: د.ل. страна: MA, Валюта: MAD страна: MC, валюта: € страна: MD, валюта: L страна: ME, валюта: € страна: MF, валюта: € страна: MG, валюта: Ar страна: MH, валюта: $ страна: MK, валюта: страна den: ML, валюта: страна CFA: MM, валюта: страна K: MN, валюта: ₮ страна: MO, валюта: MOP$ страна: MP, валюта: $ страна: MQ, валюта: € страна: MR, валюта: Страна единой системы обмена сообщениями: MS, валюта: страна $: MT, валюта: страна €: MU, валюта: страна Rs: MV, валюта: страна MVR: MW, валюта: страна MK: MX, валюта: страна $: MY, валюта: Страна RM: MZ, валюта: страна MTn: NA, валюта: страна $: NC, валюта: страна FCFP: NE, валюта: страна CFA: NF, валюта: страна $: NG, валюта: ₦ страна: NI, валюта: C$ страна: NL, валюта: € страна: НЕТ, валюта: страна кр: NP, валюта y: नेरू страна: NR, валюта: $ страна: NU, валюта: $ страна: NZ, валюта: $ страна: OM, валюта: ر.ع. страна: PA, валюта: B/. страна: ЧП, валюта: с / у. страна: PF, валюта: FCFP страна: PG, валюта: K страна: PH, валюта: ₱ страна: PK, валюта: Rs страна: PL, валюта: PLN страна: PM, валюта: € страна: PN, валюта: $ страна: PR, валюта: $ страна: PS, валюта: ₪ страна: PT, валюта: € страна: PW, валюта: US$ страна: PY, валюта: Gs. страна: QA, валюта: ر.ق. страна: RE, валюта: € страна: RO, валюта: страна RON: RS, валюта: страна RSD: RU, валюта: страна RUB: RW, валюта: страна РФ: SA, валюта: страна: SB, валюта: страна $: SC, валюта: страна SR: SD, валюта: страна SDG: SE, валюта: страна kr: SG, валюта: страна $: SH, валюта: страна £: SI, валюта: € страна: SJ, валюта: страна kr: SK, валюта: € страна: SL, валюта: Le страна: SM, валюта: страна €: SN, валюта: страна CFA: SO, валюта: страна S: SR, валюта: $ страна: SS, валюта: £ страна: ST, валюта: Db страна: SV, валюта: $ страна: SX, валюта: NAf. страна: SY, валюта: ل.س. страна: SZ, валюта: E страна: TC, валюта: доллар США страна: TD, валюта: страна FCFA: TG, валюта: страна CFA: TH, валюта: страна THB: TJ, валюта: сом страна: TK, валюта: $ страна: TL, валюта: US$ страна: TM, валюта: TMT страна: TN, валюта: د.ت. страна: TO, валюта: T$ страна: TR, валюта: Страна TRY: TT, валюта: страна $: TV, валюта: страна $: TW, валюта: NT$ страна: TZ, валюта: страна TSh: UA, валюта: ₴ страна: UG, валюта: страна USh: UM, валюта: $ страна: США, валюта: $ страна: UY, валюта: $ страна: UZ, валюта: так называемая страна: VC, валюта: $ страна: VE, валюта: Bs. страна: VG, валюта: доллар США страна: VI, валюта: $ страна: VN, валюта: ₫ страна: VU, валюта: VT страна: WF, валюта: FCFP страна: WS, валюта: WS$ страна: XK, валюта: € страна: YE, валюта: ر.ي. страна: YT, валюта: € страна: ZA, валюта: R страна: ZM, валюта: K страна: ZW, валюта: US$

Xcode 9.3 • Swift 4.1

var currencies: [String: (code: String, symbol: String)] = [:]
Locale.isoRegionCodes.map({
    let locale = Locale(identifier: Locale.identifier(fromComponents: [NSLocale.Key.countryCode.rawValue: $0]))
    currencies[$0] = (locale.currencyCode ?? "", locale.currencySymbol ?? "")
})

Как статический словарь Locale:

extension Locale {
    static let currencies = Dictionary(uniqueKeysWithValues: Locale.isoRegionCodes.map {
            region -> (String, (code: String, symbol: String, locale: Locale)) in
        let locale = Locale(identifier: Locale.identifier(fromComponents: [NSLocale.Key.countryCode.rawValue: region]))
        return (region, (locale.currencyCode ?? "", locale.currencySymbol ?? "", locale))
    })
}
let currency = Locale.currencies["US"]!
currency.code       // "USD"
currency.symbol     // "US$"
currency.locale     // _US (fixed)

Xcode 9 • Swift 4

let currencies = Locale.isoRegionCodes.reduce(into: [String: (code: String, symbol: String)]()) {
    let locale = Locale(identifier: Locale.identifier(fromComponents: [NSLocale.Key.countryCode.rawValue: $1]))
    $0[$1] = (locale.currencyCode ?? "", locale.currencySymbol ?? "")
}

currencies["US"]   // (code "USD", symbol "US$")
currencies["BR"]   // (code "BRL", symbol "R$")
currencies["GB"]   // (code "GBP", symbol "£")

currencies.sorted{ $0.key<$1.key }.map{ print($0) }

Вы можете получить код валюты из названия страны, проверить его на swift3, в первую очередь добавить это расширение

extension NSLocale {
class func locales1(countryName1 : String) -> String {
    let locales : String = ""
    for localeCode in NSLocale.isoCountryCodes {
        let countryName = (Locale.current as NSLocale).displayName(forKey: .countryCode, value: localeCode)
        if countryName1.lowercased() == countryName?.lowercased() {
            return localeCode
        }
    }
    return locales
}

}

Вы получите код валюты здесь

        let countryCode = NSLocale.locales1(countryName1: "\(place.name)")

        let countryCodeCA = countryCode 
        let localeIdCA = NSLocale.localeIdentifier(fromComponents: [ NSLocale.Key.countryCode.rawValue : countryCodeCA])
        let localeCA = NSLocale(localeIdentifier: localeIdCA)
        let currencySymbolCA = localeCA.object(forKey: NSLocale.Key.currencySymbol)
        let currencyCodeCA = localeCA.object(forKey: NSLocale.Key.currencyCode)

        print("\(currencyCodeCA!)")
        self.currencyKey = currencyCodeCA! as! String

Вы не можете сделать это с одним символом валюты. Вы должны позволить системе отформатировать ваши номера в валюте с правильным языком.

Например, более десятка стран используют евро, и они по-разному отображают деньги. И символом валюты для США является только "$", если вы находитесь в США - например, в Канаде это "US$", потому что канадцы используют "$" для своей собственной валюты.

Другие вопросы по тегам