2011-08-02 17 views
7

Estoy tratando esto:¿Cómo obtener NSLocale del código de moneda?

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

Se crea un objeto NSLocale pero hace el `t contienen ninguna información regional. Por ejemplo,

[localeForDefaultCurrency objectForKey:NSLocaleCountryCode]; 

devuelve nil;

¿Alguna idea de cómo obtener NSLocale desde el código de moneda?

+1

Encontré una pista. El código de moneda consta de tres letras y generalmente la primera y la segunda letra es el código de país. Por ejemplo "USD" -> "US". Usando el código de país, el código anterior funciona por alguna razón. No estoy 100% seguro de si funciona en cualquier caso. – kastet

+1

No estoy seguro de que este principio funcione para todas las monedas;) –

Respuesta

5

Hay trucos como crear locale con id pero en lugar de id local normalle como "en_US" pasarlo código de moneda "USD", "EUR", etc., parece funcionar para eur y usd de una manera que pude compruébalo, pero esta es una manera incorrecta en mi humilde opinión.

La única forma correcta que conozco es obtener todas las configuraciones regionales y luego verificar en bucle sus códigos de moneda para compararlos con los que tiene. De esta manera, detendrá el ciclo cuando encuentre su código.

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

¿Qué ocurre con los casos en los que se usa una moneda en varios países? –

7

tal como fue anunciado por algunos huéspedes en Pastebin:

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

En mi caso, tenía el código de moneda y el código de país. Funciona como un encanto, gracias. –

1

Puede usar el poder de extensiones en Swift:

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 
    } 

} 

De esta manera, en cualquier lugar de su código:

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