Rushabh
Rushabh

Reputation: 3203

Get Currency Symbol based on Country code or Country name using NSLocale

I want to display Currency Symbol based on Country name or country code using NSLocale I have all the country name list. suppose I have selected USA then it Return $ Currency

Code :

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

Upvotes: 3

Views: 12944

Answers (4)

Leo Dabus
Leo Dabus

Reputation: 236260

Xcode 10 • Swift 4.2 or later

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

Locale.currency["US"]   // (code "USD", symbol "$", name "US Dollar")
Locale.currency["BR"]   // (code "BRL", symbol "R$", name "Brazilian Real")
Locale.currency["GB"]   // (code "GBP", symbol "£", name "British Pound")
Locale.currency["PT"]   // (code "EUR", symbol "€", name "Euro")

For older Swift syntax please check the post edit history

Upvotes: 24

rmaddy
rmaddy

Reputation: 318774

You can build your own list of country codes and that country's currency symbol using the following code:

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);
    }
}

This code starts with the list of all locale ids. From there it creates each associated NSLocale. For each locale, the country code and currency symbol is extracted. These are used to build a dictionary of country codes and currency symbols which are then printed out.

Here's the same code translated to 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)")
    }
}

This results in the following list when run on a simulated iOS 10 device:

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

Upvotes: 7

Jerin Thanikkal
Jerin Thanikkal

Reputation: 21

You can Get currency code from Country name, tested it on swift3, first of all add this extension

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
}

}

You will get the currency code from here

        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

Upvotes: 2

gnasher729
gnasher729

Reputation: 52530

You can't do that with the currency symbol alone. You have to let the system format your numbers as a currency with the correct locale.

For example, there are over a dozen countries using Euros, and they display money in different ways. And the currency symbol for the USA is only "$" if you are in the USA - in Canada, for example, it is "US$" because Canadians use "$" for their own currency.

Upvotes: 1

Related Questions