5

像我这样的新手在本地化方面也有类似的问题,但我找不到对我有用的问题。

这是我的问题。我们可以使用 NSArray 形式的语句获取所有 ISO 国家/地区代码[NSLocale ISOCountryCodes]。现在,对于每个国家,我想打印当地货币以及该国家使用的货币代码。这样做的适当方法是什么?

我做了以下不起作用的事情,因为我得到了 US United States: (null) ((null)) 的行,而我想得到 US United States: $ (USD) 的行:

myCountryCode = [[NSLocale ISOCountryCodes] objectAtIndex:row];
appLocale = [[NSLocale alloc] initWithLocaleIdentifier: @"en_US"];
identifier = [NSLocale localeIdentifierFromComponents: [NSDictionary
                      dictionaryWithObject: myCountryCode 
                                    forKey: NSLocaleCountryCode]];
myDictionary = [NSLocale componentsFromLocaleIdentifier: identifier];
myCountryName = [appLocale displayNameForKey:NSLocaleCountryCode 
                                       value:[myDictionary
                                             objectForKey:NSLocaleCountryCode]];
localCurrencySymbol = [appLocale displayNameForKey:NSLocaleCurrencySymbol
                      value:[myDictionary objectForKey:NSLocaleCurrencySymbol]];
currencyCode = [appLocale displayNameForKey:NSLocaleCurrencyCode 
                value: [myDictionary objectForKey:NSLocaleCurrencyCode]];
title = [NSString stringWithFormat:@"%@ %@: %@ (%@)", myCountryCode, myCountryName, localCurrencySymbol, currencyCode];
[appLocale release];

(上面的标识符,myCountryCode,myCountryName,localCurrencySymbol,currencyCode,title都是NSString指针。另外myDictionary是NSDictionary指针,appLocale是NSLocale指针)。本质上,上面的代码将在一个pickerview中,我想在其中动态生成每一行的标题。

非常感谢您的宝贵时间。本质上,问题是一旦我们有了 ISO 国家代码,我们如何打印(在应用程序区域设置中)该特定国家的货币符号和货币代码。

4

3 回答 3

10

对于任何只想从 3 个字母 iso 代码 ( commonISOCurrencyCodes ) 中获取货币代码的人。你可以简单地做到这一点。

NSString *localeId = @"JPY"; //[[NSLocale commonISOCurrencyCodes] objectAtIndex:1];
NSLocale *locale = [NSLocale currentLocale];
NSString *currency = [locale displayNameForKey:NSLocaleCurrencySymbol
                                       value:localeId];
NSLog(@"locale %@ currency %@", localeId, currency);

印刷。

locale JPY currency ¥
于 2012-12-07T12:16:20.837 回答
5

我认为您的问题是您期望componentsFromLocaleIdentifer返回有关语言环境的信息。相反,它返回有关作为标识符传入的字符串的信息。虽然您可以接收 NSLocalCurrencySymbol,但它只会在您传入的字符串具有特定货币的覆盖时才会出现(这在您的情况下永远不会发生,因为您只使用标准数组)。这方面的一个例子是一个用户已经建立了一个 FR 系统,但使用的是美元货币。

通常,您不需要使用-displayNameForKey:value:and NSLocaleCurrencyCodeNSLocaleCurrencySymbol因为它们都返回国际字符串,而不是本地化字符串。因此,一旦您拥有首选本地,您应该能够通过使用-objectForKey:.

在我的测试中,棘手的部分是假设列表中的语言环境足以创建有效的货币代码和符号是不正确的,相反,您需要有语言和国家代码。幸运的是,+[NSLocale canonicalLanguageIdentifierFromString:]它将为您提供正确的语言,然后您可以将其附加到国家代码(在 a 之后_)以创建国家/语言字符串,从而适当地检索货币信息。

这是我修改后的代码:

myCountryCode = [[NSLocale ISOCountryCodes] objectAtIndex:row];
appLocale = [[NSLocale alloc] initWithLocaleIdentifier: @"en_US"];
identifier = [NSLocale localeIdentifierFromComponents: [NSDictionary
        dictionaryWithObject: myCountryCode 
        forKey: NSLocaleCountryCode]];
myDictionary = [NSLocale componentsFromLocaleIdentifier: identifier];
myCountryName = [appLocale displayNameForKey:NSLocaleCountryCode 
         value:[myDictionaryobjectForKey:NSLocaleCountryCode]];

// Create the currency language combination and then make our locale
NSString *currencyLocaleLanguage= [NSLocale canonicalLanguageIdentifierFromString: myCountryCode];
NSString *countryLanguage= [NSString stringWithFormat: @"%@_%@", myCountryCode, currencyLocaleLanguage];
NSLocale *currencyLocale = [[NSLocale alloc] initWithLocaleIdentifier: countryLanguage];

localCurrencySymbol = [currencyLocale objectForKey:NSLocaleCurrencySymbol];
currencyCode = [currencyLocale objectForKey:NSLocaleCurrencyCode];

title = [NSString stringWithFormat:@"%@ %@: %@ (%@)", myCountryCode, myCountryName, localCurrencySymbol, currencyCode];
[currencyLocale release];
[appLocale release];
于 2012-06-09T11:33:34.590 回答
5

尝试以下测试应用并根据需要进行调整

#import <Foundation/Foundation.h>

int main(int argc, char *argv[]) {
    NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init];

    //  select an arbitrary locale identifier; you could use your row index but your
    //  indexing scheme would be different
    NSString *localeIdentifier = [[NSLocale availableLocaleIdentifiers] objectAtIndex:72];
    //  get the selected locale and the application locale
    NSLocale *selectedLocale = [[NSLocale alloc] initWithLocaleIdentifier:localeIdentifier];
    NSLocale *appLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
    //  country code and name (in app's locale)
    NSString *countryCode = [selectedLocale objectForKey:NSLocaleCountryCode];
    NSString *countryName = [appLocale displayNameForKey:NSLocaleCountryCode value:countryCode];
    //  symbol and currency code
    NSString *localCurrencySymbol = [selectedLocale objectForKey:NSLocaleCurrencySymbol];
    NSString *currencyCode = [selectedLocale objectForKey:NSLocaleCurrencyCode];
    NSString *title = [NSString stringWithFormat:@"%@ %@: %@ (%@)", countryCode, countryName, localCurrencySymbol, currencyCode];
    [appLocale release];

    NSLog(@"title = %@",title);

    [p release];
}

这会将以下内容记录到控制台:

2012-06-09 06:01:08.299 Untitled 2[11668:707] title = ES Spain: € (EUR)
于 2012-06-09T11:05:52.423 回答