How can i get currency symbols from currency code

2020-02-20 07:26发布

I have get currency code (Eg: USD, EUR, INR) from webservice response. I need to show the currency symbols for the corresponding currency code. If the currency code is USD, i need to show $, if the currency code is EUR i need to show €. How can i do this? Please suggest any idea or sample code to do this. Please help me. Thanks in advance.

9条回答
女痞
2楼-- · 2020-02-20 08:10

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.

查看更多
贼婆χ
3楼-- · 2020-02-20 08:20

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];
查看更多
▲ chillily
4楼-- · 2020-02-20 08:22

Building on code from @Mike Abdullah and @Umka, here are some functions in Swift.

func findCodeAndSymbolForAllLocales() {
    let locales = NSLocale.availableLocaleIdentifiers()

    for localeId in locales {
        let locale = NSLocale(localeIdentifier: localeId)
        if let code = locale.objectForKey(NSLocaleCurrencyCode) as? String,
            let symbol = locale.objectForKey(NSLocaleCurrencySymbol) {

            print("\(code) \(symbol)")

        }
    }
}


func findCurrencySymbolByCode(currencyCode:String) -> String? {

    guard let locale = findLocaleByCurrencyCode(currencyCode) else {
        print("locale for \(currencyCode) is nil")
        return nil
    }

    return locale.objectForKey(NSLocaleCurrencySymbol) as? String
}

func findLocaleByCurrencyCode(currencyCode:String) -> NSLocale? {

    let locales = NSLocale.availableLocaleIdentifiers()
    var locale:NSLocale?
    for localeId in locales {
        locale = NSLocale(localeIdentifier: localeId)
        if let code = locale!.objectForKey(NSLocaleCurrencyCode) as? String {
            if code == currencyCode {
                return locale
            }
        }
    }

    return locale
}
查看更多
登录 后发表回答