2009-05-13 2 views
16

Я бы хотел, чтобы мое приложение iPhone позволяло вводить, отображать и хранить суммы в валюте, используя для этого символ ($, €, ₤, ¥ и т. Д.).Локализовать валюту для iPhone

Может ли NSNumberFormatter делать все, что мне нужно? Что происходит, когда пользователь переключает свою локаль, и эти суммы (доллары, иены и т. Д.) Сохраняются как NSDecimalNumbers. Я полагаю, что для того, чтобы быть в безопасности, необходимо как-то захватить локаль во время ввода, а затем символ валюты и сохранить их в моем экземпляре вместе с NSDecimalNumber ivar, чтобы они могли быть развернуты и отображены соответствующим образом по дороге, если пользователь изменит их языковой стандарт с момента создания предмета?

Извините, у меня мало опыта локализации, так что надеемся на пару быстрых указателей перед погружением. Наконец, любое понимание того, как вы обрабатываете такой вход, учитывая ограничения на клавиатурах iPhone?

ответ

32

NSNumberFormatter - это, безусловно, путь! Вы можете установить NSLocale на NSNumberFormatter, форматтер будет автоматически вести себя в соответствии с этой локалью. Языковой стандарт по умолчанию для форматирования чисел всегда является валютой для выбранного региона региона.

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

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

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

Это будет вести журнал «5.00» в соответствии с региональным форматом города по умолчанию. Если вы хотите изменить валюту, которую вы можете установить:

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

Которая выберет валюту по умолчанию для этой локали.

Часто, если вы не платите в местной валюте вашего пользователя, но в своем собственном. Для того, чтобы заставить NSNumberFormatter форматировать в валюте, при сохранении форматирования номеров в предпочтениях пользователя, используйте:

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

В ан-США это будет формат, как $5.00 в NL-NL это $ 5,00.

+0

Вот что я подумал. Мне любопытно, что происходит, когда пользователь меняет свой локаль после того, как someAmount был заархивирован на диск. IPhone мог бы, довольно легко, оказаться в другой стране в командировке. Если пользователю удобно пользоваться локальным языком и т. Д., Они могут изменить Locale. Что происходит, когда этот объект не имеет аналогов? Будет ли оно отображаться как «5,00 долларов США», как было создано и предназначено, или оно будет отображаться как «¥ 5», что, очевидно, имеет существенно отличную денежную оценку, но является правильно отформатированным NSDecimalNumber «5.00», когда языковой стандарт currencyFormatter - Япония. – Meltemi

+0

Вы можете сохранить некоторый формат форматированного или неформатированного. Если вы сохраните его в форматированном виде, сумма всегда будет отражать валюту, в которой она была сделана. Если вы сохраните ее неформатированной, форматировщик просто отформатирует ее в текущей локали, но не сделает никакого преобразования! Таким образом: «$ 5,00» станет «¥ 5». То, что я делаю в своем приложении, это хранить как неформатированную валюту, так и локаль. Таким образом, я всегда уверен, что валюта отформатирована в локали, в которую она была сделана, но я также могу добавить конвертацию валюты позже. – klaaspieter

+0

просто c/p'ing этот код, я получаю предупреждение: формат не строковый литерал и аргументы формата Могу ли я не получить это? – oberbaum

Смежные вопросы