【问题标题】:Localize Currency for iPhone为 iPhone 本地化货币
【发布时间】:2009-05-13 04:07:57
【问题描述】:

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

NSNumberFormatter 会做我需要的一切吗?当用户切换他们的区域设置并且这些金额(美元、日元等)存储为 NSDecimalNumbers 时会发生什么。我认为,为了安全起见,有必要在输入时以某种方式捕获语言环境,然后捕获货币符号并将它们与 NSDecimalNumber ivar 一起存储在我的实例中,以便它们可以在用户更改时展开并在路上适当显示他们从创建项目时开始的语言环境?

抱歉,我没有多少本地化经验,所以希望在深入研究之前得到一些快速的指导。最后,鉴于 iPhone 键盘的限制,您对如何处理此类输入有任何见解吗?

【问题讨论】:

    标签: iphone cocoa-touch localization currency


    【解决方案1】:

    NSNumberFormatter 绝对是要走的路!您可以在 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

    【讨论】:

    • 我就是这么想的。我很好奇当用户在 someAmount 被归档到磁盘后更改他们的语言环境时会发生什么。 iPhone可以很容易地发现自己在另一个国家出差。如果用户对当地语言等感到满意,他们可能会更改区域设置。当这个对象被取消归档时会发生什么?它会按照创建和预期的方式显示为“$5.00”,还是显示为“¥5”,这显然具有明显不同的货币价值,但当currencyFormatter 的语言环境为日本时,它是一个正确格式为“5.00”的NSDecimalNumber。
    • 您可以存储一些格式化或未格式化的金额。如果您将其存储为格式化,则金额将始终反映其制作的货币。如果您将其存储为未格式化,格式化程序将仅在当前语言环境中对其进行格式化,但不会进行任何转换!因此:“$5.00”将变为“¥5”。我在我的应用程序中所做的是存储未格式化的货币及其语言环境。通过这种方式,我始终可以确定货币是在其制作的语言环境中格式化的,但我也可以稍后添加货币转换。
    • 只是通过 c/p'ing 这段代码,我得到警告:格式不是字符串文字,没有格式参数我不能得到这个吗?
    • @norskben - 试试NSLog(@"%@",[[currencyFormatter stringFromNumber:someAmount] description]);
    • @norskben - Apple 在没有格式参数的情况下更改了 NSLog 的行为,以便在某些时候发出警告。我的代码是在那之前写的。我更正了代码,它现在应该可以在没有警告的情况下工作了。
    猜你喜欢
    • 2016-10-10
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多