将iPhone的货币本地化

将iPhone的货币本地化,iphone,cocoa-touch,localization,currency,Iphone,Cocoa Touch,Localization,Currency,我希望我的iPhone应用程序允许用户使用适当的符号($、€、₤、¥等)输入、显示和存储货币金额 NSNumberFormatter会做我需要的一切吗?当用户切换其区域设置并将这些金额(美元、日元等)存储为小数时会发生什么。我假设,为了安全起见,有必要以某种方式捕获输入时的区域设置,然后捕获货币符号,并将它们与NSDecimalNumber ivar一起存储在我的实例中,这样,如果用户在创建项目后更改了其区域设置,它们就可以被适当地展开和显示 对不起,我没有什么本地化经验,所以希望在开始之前能有

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

NSNumberFormatter会做我需要的一切吗?当用户切换其区域设置并将这些金额(美元、日元等)存储为小数时会发生什么。我假设,为了安全起见,有必要以某种方式捕获输入时的区域设置,然后捕获货币符号,并将它们与NSDecimalNumber ivar一起存储在我的实例中,这样,如果用户在创建项目后更改了其区域设置,它们就可以被适当地展开和显示


对不起,我没有什么本地化经验,所以希望在开始之前能有一些快速的提示。最后,考虑到iPhone键盘的局限性,您对如何处理此类输入有何见解?

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

,我就是这么想的。我很好奇,当用户在将一些内容存档到磁盘后更改其区域设置时会发生什么。iPhone很容易就可以在另一个国家出差。如果用户熟悉本地语言等,他们可能会更改区域设置。此对象未归档时会发生什么情况?当currencyFormatter的区域设置为Japan时,它会显示为“5.00美元”,还是会显示为“5元”,显然,它具有明显不同的货币值,但是正确格式的NSDecimalNumber“5.00”。您可以存储一些格式化或未格式化的金额。如果将其格式化存储,则金额将始终反映其所用的货币。如果未格式化存储,格式化程序将仅在当前区域设置中格式化,但不会进行任何转换!因此:“$5.00”将变为“$5”。我在我的应用程序中所做的是存储未格式化的货币及其区域设置。通过这种方式,我始终可以确定货币是在其所在的语言环境中格式化的,但我也可以在以后添加货币转换。仅通过c/p这段代码,我就得到警告:格式不是字符串文字,没有格式参数,我不能得到这个吗?@norskben-Try
NSLog(@“%@,[[currencyFormatter stringFromNumber:someAmount]description]);
@norskben-Apple在没有格式参数的情况下更改了NSLog的行为,以便在某个时候抛出警告。我的代码是在那之前写的。我更正了代码,现在应该可以在没有警告的情况下工作了。