Локализация валюты для iPhone

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

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

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


person Meltemi    schedule 13.05.2009    source источник


Ответы (1)


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 = @"$"

В en-US это будет форматироваться как $5.00, в nl-NL это $ 5,00.

person klaaspieter    schedule 13.05.2009
comment
Это то, о чем я думал. Мне любопытно, что происходит, когда пользователь меняет свой языковой стандарт после того, как someAmount был заархивирован на диск. IPhone довольно легко мог оказаться в другой стране в командировке. Если пользователь хорошо владеет местным языком и т. Д., Он может изменить языковой стандарт. Что происходит, когда этот объект разархивируется? Будет ли он отображаться как «5,00 долларов США», как было создано и предназначено, или будет отображаться как «5 ¥», что, очевидно, имеет существенно другое денежное значение, но является правильно отформатированным NSDecimalNumber, равным «5,00», когда локалью currencyFormatter является Япония. - person Meltemi; 13.05.2009
comment
Вы можете хранить someAmount как в форматированном, так и в неформатированном виде. Если вы сохраните его в форматированном виде, сумма всегда будет отражать валюту, в которой он был создан. Если вы сохраните его в неформатированном виде, средство форматирования просто отформатирует его в текущем языковом стандарте, но не будет выполнять никакого преобразования! Таким образом: «5 долларов» превратятся в «5 ¥». В своем приложении я храню как неформатированную валюту, так и ее локаль. Таким образом, я всегда уверен, что валюта отформатирована в соответствии с локалью, в которой она была сделана, но я также могу добавить конвертацию валюты позже. - person klaaspieter; 14.05.2009
comment
Просто нажав c / p'ing этот код, я получаю предупреждение: формат не строковый литерал и нет аргументов формата. Могу ли я этого не понять? - person oberbaum; 19.01.2010
comment
@norskben - Попробуйте NSLog(@"%@",[[currencyFormatter stringFromNumber:someAmount] description]); - person Moshe; 24.06.2010
comment
@norskben - Apple изменила поведение NSLog без аргумента формата, чтобы в какой-то момент выдать предупреждение. Мой код был написан до этого момента. Исправил код, теперь он должен работать без предупреждения. - person klaaspieter; 05.07.2010
comment
Похоже, это не работает в симуляторе iOS8 в XCode 6.1.1 - какой бы регион я ни установил, я получаю доллары США из currentLocale. Тем не менее, отлично работает на устройстве iOS8. - person Echelon; 20.01.2015
comment
@Navi aLocale, наверное, примерно так: NSLocale *aLocale = [NSLocale currentLocale]; - person CyberMew; 09.01.2017