2011-08-02 1 views
7

나는 이것을 시도하고있다 :통화 코드에서 NSLocale을 얻는 방법?

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

NSLocale 객체를 생성하지만 어떤 지역 정보도 포함하지 않는다. 예를 들어,

[localeForDefaultCurrency objectForKey:NSLocaleCountryCode]; 

는 nil을 반환합니다.

통화 코드에서 NSLocale을 얻는 방법에 대한 아이디어가 있으십니까?

+1

힌트를 발견했습니다. 통화 코드는 세 문자로 구성되며 일반적으로 첫 번째와 두 번째 문자는 국가 코드입니다. 예 : "USD"-> "US" 위의 코드는 국가 코드를 사용하여 작동합니다. 나는 그것이 어떤 경우에 작동하는지 100 % 확실하지 않다. – kastet

+1

이 원칙이 모든 통화에 대해 잘 작동하는지 모르겠다;) –

답변

5

"en_US"와 같은 일반 로캘 ID 대신 로캘을 만드는 것과 같은 속임수가 있습니다. "US", "EUR"등의 통화 코드를 전달합니다. eur 및 usd에서 가능한 방식으로 작동하는 것처럼 보입니다. 그것을 확인하지만 이것은 잘못된 방법 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)") 
}