2009-05-13 9 views
16

Me gustaría que mi aplicación de iPhone permita la entrada, visualización y almacenamiento de cantidades de moneda utilizando el símbolo apropiado ($, €, ₤, ¥, etc.) para el usuario.Localize Currency for iPhone

¿NSNumberFormatter haría todo lo que necesito? ¿Qué sucede cuando un usuario cambia su configuración regional y estos importes (dólares, yen, etc.) se almacenan como NSDecimalNumbers? Supongo que, para estar seguro, es necesario capturar de algún modo la configuración regional en el momento de la entrada y luego el símbolo de moneda y almacenarlos en mi instancia junto con NSivarNúmero ivar para que puedan desenvolverse y mostrarse adecuadamente en el futuro si el usuario cambia su configuración regional desde el momento en que se creó el elemento?

Disculpe, tengo poca experiencia en localización, así que espero un par de consejos rápidos antes de bucear. Por último, ¿tiene alguna idea de cómo manejar este tipo de entrada dadas las limitaciones de los teclados del iPhone?

Respuesta

32

¡NSNumberFormatter es definitivamente el camino a seguir! Puede configurar un NSLocale en el NSNumberFormatter, el formateador se comportará automáticamente de acuerdo con esa configuración regional. La configuración regional predeterminada para un formateador de número es siempre la moneda para el formato de región seleccionado por el usuario.

NSDecimalNumber *someAmount = [NSDecimalNumber decimalNumberWithString:@"5.00"]; 

NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init]; 
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]; 

NSLog(@"%@", [currencyFormatter stringFromNumber:someAmount]); 

Esto registrará la cantidad '5.00' de acuerdo con el formato de región predeterminado del usuario. Si desea modificar la moneda, puede configurar:

NSLocale *aLocale = [[NSLocale alloc] initWithLocaleIdentifier: "nl-NL"] 
[currencyFormatter setLocale:aLocale]; 

Que elegirá la moneda predeterminada para esa configuración regional.

A menudo, no está cargando en la moneda local de su usuario, sino en la suya. Para forzar NSNumberFormatter para dar formato en su moneda, mientras se mantiene el formato de número en la preferencia del usuario, utilice:

currencyFormatter.currencyCode = @"USD" 
currencyFormatter.internationalCurrencySymbol = @"$" 
currencyFormatter.currencySymbol = @"$" 

En es-esto va a dar formato como $5.00 en nl-NL es $ 5,00.

+0

Eso es lo que pensé. Tengo curiosidad por saber qué sucede cuando el usuario cambia su configuración regional después de que se haya archivado algúnAmount en el disco. El iPhone podría, con bastante facilidad, encontrarse en otro país en un viaje de negocios. Si el usuario se siente cómodo con el idioma local, etc., puede cambiar la configuración regional. ¿Qué sucede cuando este objeto se desarchiva? ¿Se mostrará como '$ 5,00' como fue creado y previsto, o se mostrará como '¥ 5' que, obviamente, tiene un valor monetario significativamente diferente pero es un NSDecimalNumber con formato correcto de '5,00' cuando la configuración regional de currencyFormatter es Japón. – Meltemi

+0

Puede almacenar someAmount formateado o sin formato. Si lo almacena en formato, la cantidad siempre reflejará la moneda en la que se creó. Si lo almacena sin formato, el formateador simplemente lo formateará en la configuración regional actual, pero no realizará ninguna conversión. Por lo tanto: '$ 5,00' se convertirá en '¥ 5'. Lo que hago en mi aplicación es almacenar tanto la moneda no formateada como su configuración regional. De esta forma, siempre estoy seguro de que la moneda está formateada en la configuración regional en la que se creó, pero también puedo agregar la conversión de moneda más adelante. – klaaspieter

+0

simplemente al hacer clic en este código, aparece la advertencia: formato no literal de cadena ni argumentos de formato ¿No puedo obtener esto? – oberbaum