How can i get currency symbols from currency code in iphone?

This code works charm in my project. I will share this to you all.

NSString *currencyCode = @"EUR";
    NSLocale *locale = [[[NSLocale alloc] initWithLocaleIdentifier:currencyCode] autorelease];
    NSString *currencySymbol = [NSString stringWithFormat:@"%@",[locale displayNameForKey:NSLocaleCurrencySymbol value:currencyCode]];
    NSLog(@"Currency Symbol : %@", currencySymbol);

Thanks.


NSLocale will happily tell you the currency symbol used by a particular locale:

[locale objectForKey:NSLocaleCurrencySymbol];

It'll also tell you the currency code:

[locale objectForKey:NSLocaleCurrencyCode];

So all you have to do now is look up the locale that corresponds to a given code. There's no built-in method (that I'm aware of) to do this directly, so loop through all the known locales and pick the one that matches. @Umka's answer has a good example of this in the -findLocaleByCurrencyCode: method.

You could optimise the process by building your own lookup table, rather than iterating through all locales each time. You may need to handle the possibility of duplicate currency codes too, which would require some heuristic for deciding which is the most likely locale.


This code is what you are looking for though not very efficient because of loop for locales. Still it works correctly for all currency codes, not just for eur or usd. Hope this will help you.

- (NSLocale *) findLocaleByCurrencyCode:(NSString *)_currencyCode
{
        NSArray *locales = [NSLocale availableLocaleIdentifiers];
        NSLocale *locale = nil;

        for (NSString *localeId in locales) {
                locale = [[[NSLocale alloc] initWithLocaleIdentifier:localeId] autorelease];
                NSString *code = [locale objectForKey:NSLocaleCurrencyCode];
                if ([code isEqualToString:_currencyCode])
                        break;
                else
                        locale = nil;

        }

        return locale;
}

- (NSString *)findCurrencySymbolByCode:(NSString *)_currencyCode
{
        NSNumberFormatter *fmtr = [[NSNumberFormatter alloc] init];
        NSLocale *locale = [self findLocaleByCurrencyCode:_currencyCode];
        NSString *currencySymbol;
        if (locale)
                [fmtr setLocale:locale];
        [fmtr setNumberStyle:NSNumberFormatterCurrencyStyle];
        currencySymbol = [fmtr currencySymbol];
        [fmtr release];

        if (currencySymbol.length > 1)
                currencySymbol = [currencySymbol substringToIndex:1];
        return currencySymbol;
}

Use it this way:

NSString *currencySymbol = [self findCurrencySymbolByCode:currencyCode];

Swift 4 version

Finding locale by currency code:

let localeGBP = Locale
                  .availableIdentifiers
                  .lazy
                  .map { Locale(identifier: $0) }
                  .first { $0.currencyCode == "GBP" }
print(localeGBP?.currencySymbol) // £

Formatting currency

if let locale = localeGBP {
  let formatter = NumberFormatter()
  formatter.numberStyle = .currency
  formatter.locale = locale
  let result = formatter.string(from: 100000) // £100,000.00
}

Edit:

Why .lazy? Without it the loop would run over all the locale identifiers and return the first one which matches. That's about 700ish identifiers, and if the first one is the one you want then you have wasted creating 699 Locales :) With .lazy in there it automatically stops at the first matching one. In my case it reduces the number of times through the loop from 710 down to 22 when converting "GBP". This isn't important if you are only doing this once, but if you're doing this a number of times (i.e. over an array of symbols) then it's an easy way to get a bit more efficiency.