2011-08-02 11 views
7

私はこれをしようとしています:通貨コードからNSLocaleを取得するには?

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

それはNSLocaleオブジェクトを作成しますが、それはどの地域情報が含まれていdoes`t。たとえば、

[localeForDefaultCurrency objectForKey:NSLocaleCountryCode]; 

はnilを返します。

通貨コードからNSLocaleを取得するにはどうすればよいですか?

+1

ヒントが見つかりました。通貨コードは3文字で構成され、一般に1番目と2番目の文字は国コードです。たとえば、 "USD" - > "US"などです。国コードを使用すると、何らかの理由で上記のコードが動作します。いずれにしても動作するかどうかは100%確信していません。 – kastet

+1

この原則がすべての通貨で有効かどうか分かりません; –

答えて

5

"en_US"のような通常のロケールIDの代わりにID付きロケールを作成するなどのトリックがあります。通貨コード "USD"、 "EUR"などを渡します。これを確認してくださいが、これは間違った方法IMHOです。

私が知っている唯一の正しい方法は、すべてのロケールを取得して、ループ内で通貨コードを調べて、所有しているものと比較することです。こうすることで、コードを見つけたらループを止めることができます。ペーストビンにいくつかのゲストによる投稿のよう

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

複数の国で通貨が使用されている場合はどうなりますか? –

7

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

[localeForDefaultCurrency objectForKey:NSLocaleCountryCode]; 
5
NSDictionary *localeInfo = @{NSLocaleCurrencyCode: currencyCode, NSLocaleLanguageCode: [[NSLocale preferredLanguages] objectAtIndex:0]}; 

    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier: 
         [NSLocale localeIdentifierFromComponents:localeInfo]]; 
+0

私の場合、私は通貨と国コードの両方を持っていました。魅力のように働く、ありがとう。 –

1

あなたはスウィフト拡張の電源を使用することができます。

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)") 
} 
関連する問題