Как получить NSLocale из кода валюты? - PullRequest
7 голосов
/ 02 августа 2011

Я пытаюсь это:

NSDictionary *components = [NSDictionary dictionaryWithObject:@"USD" forKey:NSLocaleCurrencyCode];
NSString *localeIdentifier = [NSLocale localeIdentifierFromComponents:components];
NSLocale *localeForDefaultCurrency = [[NSLocale alloc] initWithLocaleIdentifier:localeIdentifier];

Создает объект NSLocale, но не содержит никакой региональной информации.Например,

[localeForDefaultCurrency objectForKey:NSLocaleCountryCode];

возвращает ноль;

Есть идеи, как получить NSLocale из кода валюты?

Ответы [ 4 ]

8 голосов
/ 09 июня 2013

Как написал Гость в pastebin:

NSDictionary *components = [NSDictionary dictionaryWithObject:@"USD" forKey:NSLocaleCurrencyCode];
NSString *localeIdentifier = [NSLocale localeIdentifierFromComponents:components];
NSLocale *localeForDefaultCurrency = [[NSLocale alloc] initWithLocaleIdentifier:localeIdentifier];

[localeForDefaultCurrency objectForKey:NSLocaleCountryCode];
5 голосов
/ 23 декабря 2013
    NSDictionary *localeInfo = @{NSLocaleCurrencyCode: currencyCode, NSLocaleLanguageCode: [[NSLocale preferredLanguages] objectAtIndex:0]};

    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:
                        [NSLocale localeIdentifierFromComponents:localeInfo]];
5 голосов
/ 20 июля 2012

Есть трюки, такие как создание локали с идентификатором, но вместо обычного идентификатора локали, например, "en_US", передайте код валюты "USD", "EUR" и т. Д. Кажется, это работает для eur и usd так, как я мог проверить это но это неверный путь ИМХО.

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

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

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

        /* For some codes that locale cannot be found, init it different way. */
        if (locale == nil) {
                NSDictionary *components = [NSDictionary dictionaryWithObject:_currencyCode
                                                                       forKey:NSLocaleCurrencyCode];

                localeId = [NSLocale localeIdentifierFromComponents:components];
                locale = [[NSLocale alloc] initWithLocaleIdentifier:localeId];
        }
        return locale;
}
1 голос
/ 11 марта 2016

Вы можете использовать мощность расширений в Swift :

extension NSLocale {

    static func currencySymbolFromCode(code: String) -> String? {
       let localeIdentifier = NSLocale.localeIdentifierFromComponents([NSLocaleCurrencyCode : code])
       let locale = NSLocale(localeIdentifier: localeIdentifier)
       return locale.objectForKey(NSLocaleCurrencySymbol) as? String
    }

}

Таким образом, в любом месте вашего кода:

let code = "EUR"
let price = 10
if let currencySymbol = NSLocale.currencySymbolFromCode(code) as? String {
    print("You have to pay \(price)\(currencySymbol)")
}
...