2011-08-02 28 views
7

Bunu deniyorum:NSLocale para biriminden nasıl edinilir?

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

NSLocale nesnesini yaratır ancak herhangi bir bölgesel bilgi içermez. Örneğin,

[localeForDefaultCurrency objectForKey:NSLocaleCountryCode]; 

, nil değerini döndürür;

NSLocale para biriminden nasıl alınır?

+1

Bir ipucu buldum. Para birimi kodu üç harfden oluşur ve genellikle ilk ve ikinci harf ülke kodudur. Örneğin "USD" -> "ABD". Herhangi bir nedenle yukarıdaki ülke kodunu kullanarak kod çalışır. Her durumda çalışıyorsa% 100 emin değilim. – kastet

+1

Bu ilkenin tüm para birimleri için çalıştığından emin değilim;) –

cevap

5

Kimlikli yerel ayar oluşturmak, ancak "en_US" gibi normal yerel kimlik kimliği yerine "USD", "EUR" vb. Para birimi kodları vermek gibi hileler var. Yapabileceğim şekilde eur ve usd için çalışıyor gibi görünüyor kontrol edin ama bu yanlış bir şekilde IMHO.

Bildiğim tek doğru yolu, tüm yerel ayarları almak ve sonra döngü içinde sahip olduğunuzla karşılaştırmak için para birimlerini denetlemektir. Bu şekilde kodunuzu bulduğunuzda döngüyü durduracaksınız. pastebin bazı Misafir tarafından gönderildi üzere

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

Birden çok ülkede para biriminin kullanıldığı durumlar nedir? –

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

Benim durumumda hem para hem de ülke kodu vardı. Bir çekicilik gibi çalışır, teşekkürler. –

1

Sen Swift yılında uzantıları gücünü kullanabilir:

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 
    } 

} 

Bu şekilde, kodunuzun herhangi bir yerinde:

let code = "EUR" 
let price = 10 
if let currencySymbol = NSLocale.currencySymbolFromCode(code) as? String { 
    print("You have to pay \(price)\(currencySymbol)") 
} 
İlgili konular