Objective c 如何从货币代码中获取NSLocale?

Objective c 如何从货币代码中获取NSLocale?,objective-c,currency,nslocale,Objective C,Currency,Nslocale,我正在尝试: NSDictionary *components = [NSDictionary dictionaryWithObject:@"USD" forKey:NSLocaleCurrencyCode]; NSString *localeIdentifier = [NSLocale localeIdentifierFromComponents:components]; NSLocale *localeForDefaultCurrency = [[NSLocale alloc] initWi

我正在尝试:

NSDictionary *components = [NSDictionary dictionaryWithObject:@"USD" forKey:NSLocaleCurrencyCode];
NSString *localeIdentifier = [NSLocale localeIdentifierFromComponents:components];
NSLocale *localeForDefaultCurrency = [[NSLocale alloc] initWithLocaleIdentifier:localeIdentifier];
它创建NSLocale对象,但不包含任何区域信息。比如说,

[localeForDefaultCurrency objectForKey:NSLocaleCountryCode];
返回零


知道如何从货币代码中获取NSLocale吗?

有一些技巧,比如用id创建区域设置,但不是像“en_US”这样的普通区域设置id,而是通过货币代码“USD”、“EUR”等传递给它,它似乎在某种程度上对欧元和美元有效,我可以检查它,但这是错误的方法

我知道的唯一正确的方法是获取所有区域设置,然后在循环中检查它们的货币代码,以与您拥有的货币代码进行比较。这样,当您找到代码时,您将停止循环

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

正如某位客人在pastebin中发布的:

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

[localeForDefaultCurrency objectForKey:NSLocaleCountryCode];

您可以在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)")
}

我发现了一个暗示。货币代码由三个字母组成,通常第一个字母和第二个字母是国家代码。例如“USD”->“US”。使用国家代码出于某种原因,上面的代码是有效的。我不能100%确定它在任何情况下是否有效。我不能确定这一原则适用于所有货币;)如果一种货币在多个国家使用,情况会怎样?在我的例子中,我有货币和国家代码。很有魅力,谢谢。
let code = "EUR"
let price = 10
if let currencySymbol = NSLocale.currencySymbolFromCode(code) as? String {
    print("You have to pay \(price)\(currencySymbol)")
}