Как получить NSLocale из кода валюты?
Я пытаюсь это:
NSDictionary *components = [NSDictionary dictionaryWithObject:@"USD" forKey:NSLocaleCurrencyCode];
NSString *localeIdentifier = [NSLocale localeIdentifierFromComponents:components];
NSLocale *localeForDefaultCurrency = [[NSLocale alloc] initWithLocaleIdentifier:localeIdentifier];
Создает объект NSLocale, но не содержит никакой региональной информации. Например,
[localeForDefaultCurrency objectForKey:NSLocaleCountryCode];
возвращает ноль;
Есть идеи, как получить NSLocale из кода валюты?
4 ответа
Как написано некоторыми гостями в pastebin:
NSDictionary *components = [NSDictionary dictionaryWithObject:@"USD" forKey:NSLocaleCurrencyCode];
NSString *localeIdentifier = [NSLocale localeIdentifierFromComponents:components];
NSLocale *localeForDefaultCurrency = [[NSLocale alloc] initWithLocaleIdentifier:localeIdentifier];
[localeForDefaultCurrency objectForKey:NSLocaleCountryCode];
NSDictionary *localeInfo = @{NSLocaleCurrencyCode: currencyCode, NSLocaleLanguageCode: [[NSLocale preferredLanguages] objectAtIndex:0]};
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:
[NSLocale localeIdentifierFromComponents:localeInfo]];
Есть трюки, такие как создание локали с идентификатором, но вместо обычного идентификатора локали, такого как "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;
}
Вы можете использовать возможности расширений в 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)")
}