2010-12-13 16 views
26

Aquí hay un código de cómo consigo símbolo de moneda ahora:

NSLocale *lcl = [[[NSLocale alloc] initWithLocaleIdentifier:@"au_AU"] autorelease]; 
NSNumberFormatter *fmtr = [[[NSNumberFormatter alloc] init] autorelease]; 
[fmtr setNumberStyle:NSNumberFormatterCurrencyStyle]; 
[fmtr setLocale:lcl]; 

NSLog(@"%@", [lcl displayNameForKey:NSLocaleCurrencySymbol value:@"AUD"]); 
NSLog(@"%@", [fmtr currencySymbol]); 

Ambos NSLogs vuelven "AU $". Como entendí de la documentación de desarrollo de Apple, hay al menos dos símbolos de moneda para cada moneda (aunque estos símbolos podrían ser los mismos): local (que se usa dentro de un país. $ Para Australia, por ejemplo) e internacional (AU $ para Australia). Entonces, la pregunta es cómo obtener el símbolo de moneda LOCAL. ¿Algunas ideas?

Gracias de antemano.

+1

Tal vez sea un error (es decir, supervisión del equipo localizador) en iOS. ¿Has probado lo mismo con otras configuraciones regionales, p. ¿ESTADOS UNIDOS? Si llegas allí una vez "$" y una vez "US $", entonces consideraría ese error y lo archivaría en bugreport.apple.com, y agregaría un manejo especial para este AU $ a tu código. –

+0

Sí, definitivamente es un error. Intenté esto y en_US devuelve $ – mackross

+0

@Thomas Tempelmann: Acabo de archivar un error. Gracias. – kovpas

Respuesta

9

Su código debería funcionar, sin embargo, el identificador de configuración regional es incorrecto. Debería ser "en_AU".

Ver "Uso del objeto de configuración regional" en la "Guía internacional y localización" (https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/InternationalizingLocaleData/InternationalizingLocaleData.html#//apple_ref/doc/uid/10000171i-CH13-SW4)

+0

Holy c ... Thank you man :). Resolví este problema de otra manera, pero esto realmente funciona, acabo de comprobar :). – kovpas

+0

La página vinculada es 404'd – Isuru

+0

'NSString * currencySymbol = [[NSLocale currentLocale] objectForKey: NSLocaleCurrencySymbol];' – CyberMew

9

No es ideal, ya que no está saliendo del sistema, pero obviamente puede crear su propia tabla interna usando list of current currency symbols *. Como esa lista tiene los símbolos Unicode, simplemente sería una cuestión de emparejar la lista Apple de configuraciones regionales con la lista.

Ya sabes, en caso de que los de Apple no sean realmente accesibles.

* Nota: enlace no destinado a ser autorizado, ver comentarios.

+0

Sí, claro, estaba pensando en eso, pero eso es lo que esperaba evitar. Bueno, si no hay una solución mejor, usaré esto. Gracias. – kovpas

+0

Totalmente no relacionado, pero reconozco tu icono de avatar. Conozco a los desarrolladores de Carcassonne, están aquí en la misma ciudad donde vivo. Son buenos chicos, y estoy tan feliz de que hayan aceptado este trabajo. –

+0

Hicieron un excelente trabajo con el puerto de iOS, altamente encomiable. Es una de las dos o tres mejores conversiones de juegos de tablero hasta la aplicación hasta el momento. –

12

Este fragmento devuelve el símbolo de moneda ¥ para la configuración regional "ja_JP" (podría ser cualquier otra configuración regional).

NSLocale* japanese_japan = [[[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"] autorelease]; 
NSNumberFormatter* fmtr = [[[NSNumberFormatter alloc] init] autorelease]; 
[fmtr setNumberStyle:NSNumberFormatterCurrencyStyle]; 
[fmtr setLocale:japanese_japan]; 

// Local currency symbol (what you're asking for) 
NSString* currencySymbol = [fmtr currencySymbol]; 
NSLog(@"%@", currencySymbol); // Prints '¥' 

// International currency symbol 
NSString* internationalCurrencySymbol = [fmtr internationalCurrencySymbol]; 
NSLog(@"%@", internationalCurrencySymbol); // Prints 'JPY' 

Es desafortunado que para au_AU se obtiene AU $ como el símbolo de la moneda local en lugar de sólo $, pero que debe ser la forma en que está destinado a ser mostrado en IOS. Sin embargo, tenga en cuenta que el símbolo internacional impreso para au_AU no es AU $ sino AUD.

+0

Sí, eso es extraño porque JPY (y AUD tampoco) no son símbolos de moneda internacional. Estos son códigos de moneda (puede obtenerlos en [fmtr currencyCode]). Gracias por ayudarme, pero no es exactamente lo que estaba buscando. – kovpas

0

Puede, si lo necesita, crear un archivo .strings que contiene la moneda y utilizar la función NSLocalizedString para crear la moneda localizada. Algo como esto:

en.lproj 
myApp.strings: 

"currencySymbol"="$" 
"currencyFormat"="$%lf" 

au_AU.lproj 
myApp.strings: 

"currencySymbol"="$" 
"currencyFormat"="$%lf" 

ja_JP.lproj 
myApp.strings: 

"currencySymbol"="¥" 
"currencyFormat"="¥%lf" 

y el uso que de esta manera:

NSString *money = [NSString stringWithFormat:@"%@%lf", NSLocalizedString:(@"currencySymbol"), myMoney]; 

Sin embargo, eso significa que por cada localización que el apoyo que necesita un archivo .strings. Además, esto significa que para algunas localizaciones, el símbolo de moneda no sería suficiente para mostrar el formato monetaria adecuada, lo que tendría que utilizar algo como esto:

NSString *money = [NSString stringWithFormat:NSLocalizedString(@"CurrencyFormat"), myMoney]; 

Esto tiene algunas limitaciones, pero podría funcionar para ti.

+0

Gracias por la solución. Podría funcionar, pero por ahora parece mucho más fácil la solución de Matthew Frederick: ya tengo una tabla de monedas en mi base de datos, así que solo agregaré una columna con el símbolo de moneda local. Esto parece más fácil en mi situación. Parece que no hay una solución incorporada. – kovpas

0

¿Podría obtener la cadena actual y quitarle todos los caracteres a-Z? Si la cadena resultante tiene una longitud> 0, entonces tienes tu símbolo. De lo contrario, use la cadena original.

Es hortera y no estoy seguro de si esto funcionaría para todas las monedas en todo el mundo, pero podría funcionar?

+0

No, esto no funcionará. Aquí hay una lista de monedas circulantes: Br · Br · ₵ · ¢ · C $ · ₡ · B /. · Ден. · ₫ · € · ƒ · Ft · ₲ · Kč · ₭ · K · £ ·/· ₥ · ₦ · ₱ · ₱ · ₱ · · · · · · · R · RM · RSD · · ₨ · р. · S /. · ৳ · R $ · $ · · · · ₩ · ¥ · zł · ₴ · Q · ₪ · TL. http://en.wikipedia.org/wiki/Currency_sign – kovpas

+0

¿Qué conseguir aún más sucio? Use la lista de símbolos de moneda válidos. Si es uno de ellos, úsalo. De lo contrario, quite todos los caracteres a-Z. – mackross

+0

En mi caso particular, como mencioné anteriormente, es mucho más conveniente crear una lista "CÓDIGO -> LOCAL_SYMBOL". Parece que tendré que resolver mi problema de esta manera. – kovpas

18
NSNumberFormatter *currencyFormatter = [[[NSNumberFormatter alloc] init] autorelease]; 
[currencyFormatter setLocale:[NSLocale currentLocale]]; 
[currencyFormatter setMaximumFractionDigits:2]; 
[currencyFormatter setMinimumFractionDigits:2]; 
[currencyFormatter setAlwaysShowsDecimalSeparator:YES]; 
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]; 

NSNumber *someAmount = [NSNumber numberWithFloat:5.00];  
NSString *string = [currencyFormatter stringFromNumber:someAmount]; 

Recibirá $ 5.00 para los Estados Unidos, ¥ 5.00 por Japón, 5,00 € para Europa, etc.

+0

La pregunta era sobre localizaciones específicas, no "[NSLocale currentLocale]". De todos modos, Nik proporcionó la respuesta correcta hace un par de meses. Gracias. – kovpas

+2

¥ 5,00 para Japón es francamente incorrecto. 5 yenes son aproximadamente 2 1/2 centavos. No muestra Yen con dos decimales. $ 5.00 sería alrededor de 1.000 yenes, que se muestran como ¥ 1,000 y no ¥ 1,000.00. La configuración regional sabe cómo imprimir Yen correctamente. – gnasher729

+0

Resolvió mi problema, en mi caso tuve que obtener moneda para mi producto de iNApp, así que reemplacé '[currencyFormatter setLocale: [NSLocale currentLocale]];' con '[currencyFormatter setLocale: _product.priceLocale];' –

Cuestiones relacionadas