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 ポインターです)。基本的に、上記のコードは、その場で各行のタイトルを生成したいピッカービューになります。

どうぞよろしくお願いいたします。基本的に問題は、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

次のテスト アプリを試して、必要に応じて調整します

#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 に答える
5

componentsFromLocaleIdentiferここでの問題は、ロケールに関する情報が返されることを期待していることだと思います。代わりに、識別子として渡された文字列に関する情報を返します。NSLocalCurrencySymbol を受け取ることはできますが、渡す文字列に特定の通貨のオーバーライドがある場合にのみ存在します (標準配列のみを使用しているため、このケースでは発生しません)。実際の例としては、FR システムを設定しているが通貨が USD のユーザーが挙げられます。

-displayNameForKey:value:通常、 forNSLocaleCurrencyCodeとを使用する必要はありませんNSLocaleCurrencySymbol。どちらもローカライズされた文字列ではなく、国際的な文字列を返すためです。したがって、優先ローカルを取得したら、を使用するだけでこの情報を取得できるはずです-objectForKey:

私のテストで難しいのは、リスト内のロケールが有効な通貨コードを作成するのに十分であり、記号が正しくないと仮定すると、代わりに言語と国コードが必要になることです。幸いなことに+[NSLocale canonicalLanguageIdentifierFromString:]、適切な言語が提供されます。これを国コード ( の後ろ_) に追加して、通貨情報が適切に取得される国/言語文字列を作成できます。

これが私の修正されたコードです:

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 に答える