为iPhone本地化货币

16

我希望我的iPhone应用程序能够使用适当的符号($, €, ₤, ¥等)允许用户输入、显示和存储货币金额。

NSNumberFormatter是否可以满足我的所有需求?当用户切换他们的语言环境时,这些金额(美元,日元等)被存储为NSDecimalNumbers会发生什么?为了安全起见,我假设需要在输入时以某种方式捕获语言环境,然后将货币符号与NSDecimalNumber ivar一起存储在我的实例中,以便在未来正确显示它们,以防用户更改了创建项时的语言环境?

抱歉,我没有太多本地化经验,所以希望在深入研究之前得到一些快速指针。最后,有关如何处理这种输入并考虑到iPhone键盘的限制,您有什么见解?

1个回答

32

NSNumberFormatter绝对是最好的选择!您可以在NSNumberFormatter上设置NSLocale,格式化程序将自动根据该地区设置行事。数字格式化程序的默认区域设置始终是用户所选区域格式的货币。

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,而在荷兰荷兰语中是$ 5,00


这正是我所想的。我很好奇当用户在将 someAmount 存档到磁盘后更改其区域设置时会发生什么。iPhone 可能很容易在出差时发现自己在另一个国家。如果用户对当地语言等感到舒适,他们可能会更改区域设置。当此对象取消存档时会发生什么?它会像创建和预期的那样显示为“$5.00”,还是会显示为“¥5”,显然具有显着不同的货币价值,但在 currencyFormatter 的区域设置为日本时是正确格式化的 NSDecimalNumber 的“5.00”? - Meltemi
只是通过复制粘贴这段代码,我收到了警告:格式不是字符串文字且没有格式参数。我能不能避免这个问题? - oberbaum
@norskben - 尝试使用 NSLog(@"%@",[[currencyFormatter stringFromNumber:someAmount] description]); - Moshe
在XCode 6.1.1的iOS8模拟器中似乎无法正常工作 - 无论我设置什么地区,都会从currentLocale获取USD。但在iOS8设备上运行良好。 - Echelon
@Navi aLocale 可能是这样的:NSLocale *aLocale = [NSLocale currentLocale]; - CyberMew
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接