2011-08-02 54 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]; 

返回零;

任何想法如何從貨幣代碼獲取NSLocale?

+1

我發現了一條提示。貨幣代碼由三個字母組成,通常第一個和第二個字母是國家代碼。例如「USD」 - >「US」。由於某種原因,上面的代碼使用國家代碼有效。我不是100%確定它是否在任何情況下都有效。 – kastet

+1

我不確定這個原理適用於所有貨幣; –

回答

5

有一些技巧,比如用「id」創建區域設置,而不是像「en_US」這樣的普通區域設置id,通過貨幣代碼「USD」,「EUR」等等,它似乎以我可能的方式用於eur和usd檢查它,但這是錯誤的方式恕我直言。

我知道的唯一正確方法是獲取所有語言環境,然後在循環中檢查其貨幣代碼,以便與您擁有的貨幣代碼進行比較。這樣你就可以在找到代碼時停止循環。

- (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)") 
} 
相關問題