Как я могу получить символы валюты из кода валюты в iphone? - PullRequest
23 голосов
/ 03 января 2012

Я получил код валюты (например, USD, EUR, INR) из ответа веб-службы. Мне нужно показать символы валюты для соответствующего кода валюты. Если код валюты USD, мне нужно показать $, если код валюты EUR, мне нужно показать €. Как я могу это сделать? Пожалуйста, предложите любую идею или пример кода для этого. Пожалуйста, помогите мне. Заранее спасибо.

Ответы [ 8 ]

18 голосов
/ 03 января 2012

Этот код работает шарм в моем проекте. Я поделюсь этим со всеми вами.

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

Спасибо.

15 голосов
/ 17 июля 2012

Этот код - то, что вы ищете, но не очень эффективный из-за цикла для локалей. Тем не менее, он работает правильно для всех кодов валют, а не только для евро или долларов США. Надеюсь, это поможет вам.

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

Используйте это так:

NSString *currencySymbol = [self findCurrencySymbolByCode:currencyCode];
13 голосов
/ 19 января 2017

Swift 4 версия

Поиск локали по коду валюты:

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

Форматирование валюты

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

Редактировать:

Почему.lazy?Без этого цикл перебрал бы все идентификаторы локали и вернул бы первый соответствующий.Это около 700ish идентификаторов, и если первый - тот, который вы хотите, то вы потратили впустую создание 699 локалей :) С .lazy он автоматически останавливается на первом подходящем.В моем случае это уменьшает количество раз прохождения цикла с 710 до 22 при конвертации «GBP».Это не важно, если вы делаете это только один раз, но если вы делаете это несколько раз (то есть над массивом символов), тогда это простой способ получить немного большую эффективность.

10 голосов
/ 02 октября 2013

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

[locale objectForKey:NSLocaleCurrencySymbol];

Он также сообщит вам код валюты:

[locale objectForKey:NSLocaleCurrencyCode];

Итак, все, что вам нужно сейчас сделать, - это найти локаль, соответствующую данному коду. Нет встроенного метода (который я знаю), чтобы сделать это напрямую, поэтому переберите все известные локали и выберите тот, который соответствует. У ответа * Умки есть хороший пример этого в методе -findLocaleByCurrencyCode:.

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

4 голосов
/ 15 апреля 2016

Основываясь на коде от @Mike Abdullah и @Umka, вот некоторые функции в 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
}
3 голосов
/ 29 декабря 2014
NSNumberFormatter * formatter = [NSNumberFormatter new];
formatter.numberStyle = NSNumberFormatterCurrencyStyle;

NSString * localeIde = [NSLocale localeIdentifierFromComponents:@{NSLocaleCurrencyCode: currencyCode}];
formatter.locale = [NSLocale localeWithLocaleIdentifier:localeIde];

NSString * symbol = formatter.currencySymbol;
0 голосов
/ 30 июня 2017

Свифт

let locale = NSLocale(localeIdentifier: currencyCode)
let currencySymbol = locale.displayName(forKey: .currencySymbol, value: currencyCode) ?? currencyCode
print("Currency symbol: \(currencySymbol)")
0 голосов
/ 03 января 2012
NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
    [currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];

для стиля валюты США

NSNumberFormatter *numberFormatter = [[[NSNumberFormatter alloc] init] autorelease];
    //[numberFormatter setCurrencySymbol:@"Rs"];        
    [numberFormatter setNumberStyle:@"en_IN"];

Это для индейцев

...