【问题标题】:iPhone: How to get local currency symbol (i.e. "$" instead of "AU$")iPhone:如何获取本地货币符号(即“$”而不是“AU$”)
【发布时间】:2010-12-13 10:04:08
【问题描述】:

这是我现在如何获取货币符号的代码:

NSLocale *lcl = [[[NSLocale alloc] initWithLocaleIdentifier:@"au_AU"] autorelease];
NSNumberFormatter *fmtr = [[[NSNumberFormatter alloc] init] autorelease];
[fmtr setNumberStyle:NSNumberFormatterCurrencyStyle];
[fmtr setLocale:lcl];

NSLog( @"%@", [lcl displayNameForKey:NSLocaleCurrencySymbol value:@"AUD"] );
NSLog( @"%@", [fmtr currencySymbol] );

两个 NSLog 都返回“AU$”。正如我从 Apple 开发文档中了解到的那样,每种货币至少有两个货币符号(尽管这些符号可能相同)-本地(在一个国家/地区内使用。例如,$ 用于澳大利亚)和国际(AU$澳大利亚)。所以,问题是如何获得本地货币符号。有什么想法吗?

提前致谢。

【问题讨论】:

  • 也许这实际上是 iOS 中的一个错误(即本地化团队的疏忽)。您是否尝试过与其他语言环境相同的操作,例如美国?如果您到达那里一次“$”和一次“US$”,那么我会认为这是一个错误并将其提交到 bugreport.apple.com,并在您的代码中添加对该 AU$ 的特殊处理。
  • 是的 - 绝对是一个错误。我试过这个并且 en_US 返回 $
  • @Thomas Tempelmann:我刚刚提交了一个错误。谢谢。

标签: iphone objective-c formatting currency


【解决方案1】:
NSNumberFormatter *currencyFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[currencyFormatter setLocale:[NSLocale currentLocale]];
[currencyFormatter setMaximumFractionDigits:2];
[currencyFormatter setMinimumFractionDigits:2];
[currencyFormatter setAlwaysShowsDecimalSeparator:YES];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];

NSNumber *someAmount = [NSNumber numberWithFloat:5.00];    
NSString *string = [currencyFormatter stringFromNumber:someAmount];

您将收到美国 5.00 美元、日本 5.00 日元、欧洲 5.00 欧元等。

【讨论】:

  • 问题是关于特定的语言环境,而不是“[NSLocale currentLocale]”。无论如何,尼克在几个月前提供了正确答案。谢谢。
  • 日本的 5.00 日元坦率地说是错误的。 5 日元约为 2 1/2 美分。您不会以两位小数显示日元。 5.00 美元约为 1,000 日元,显示为 ¥1,000 而不是 ¥1,000.00。语言环境知道如何正确打印日元。
  • 解决了我的问题,在我的情况下,我必须为我的 iNApp 产品获取货币,所以我将 [currencyFormatter setLocale:[NSLocale currentLocale]]; 替换为 [currencyFormatter setLocale:_product.priceLocale];
【解决方案2】:

这个 sn-p 返回区域设置“ja_JP”的货币符号 ¥(可以是任何其他区域设置)。

NSLocale* japanese_japan = [[[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"] autorelease];
 NSNumberFormatter* fmtr = [[[NSNumberFormatter alloc] init] autorelease];
 [fmtr setNumberStyle:NSNumberFormatterCurrencyStyle];
 [fmtr setLocale:japanese_japan];

 // Local currency symbol (what you're asking for)
 NSString* currencySymbol = [fmtr currencySymbol];
 NSLog( @"%@", currencySymbol ); // Prints '¥'

 // International currency symbol 
 NSString* internationalCurrencySymbol = [fmtr internationalCurrencySymbol];
 NSLog( @"%@", internationalCurrencySymbol ); // Prints 'JPY'

不幸的是,对于 au_AU,您将 AU$ 作为当地货币符号而不仅仅是 $,但这一定是它在 iOS 上的显示方式。但是请注意,为 au_AU 打印的国际符号不是 AU$,而是 AUD。

【讨论】:

  • 是的,这很奇怪,因为日元(和澳元)不是国际货币符号。这些是货币代码(您可以通过 [fmtr currencyCode] 获取它们)。感谢您的帮助,但这并不是我想要的。
【解决方案3】:

您的代码应该可以工作,但是语言环境标识符错误。应该是“en_AU”。

请参阅“国际化和本地化指南”(https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/InternationalizingLocaleData/InternationalizingLocaleData.html#//apple_ref/doc/uid/10000171i-CH13-SW4) 中的“使用 Locale 对象”

【讨论】:

  • 圣洁...谢谢你 :)。我以其他方式解决了这个问题,但这确实有效,我刚刚检查过:)。
  • NSString *currencySymbol = [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol];
【解决方案4】:

这并不理想,因为它不是从系统中出来的,但显然您可以使用 list of current currency symbols* 创建自己的内部表。由于该列表具有 unicode 符号,因此只需将 Apple 语言环境列表与列表匹配即可。

你知道,以防 Apple 提供的那些实际上无法访问。

*注意:链接不具有权威性,请参阅 cmets。

【讨论】:

  • 是的,当然,我正在考虑这个问题,但这是我希望避免的。好吧,如果没有更好的解决方案,我将使用它。谢谢。
  • 完全不相关 - 但我认得你的头像图标。我认识卡尔卡松的开发商,他们就在我住的同一个城镇。他们是好人,我很高兴他们接受了这份工作。
  • 他们在 iOS 端口方面做得非常出色,非常值得称赞。到目前为止,它是桌游到应用的前两到三个转换之一。
  • 您的链接在某些情况下不正确。 OP 正在搜索当地货币符号。但对于瑞士来说,这是错误的。它表示 CHF,而在当地则缩写为 Fr。或 SFr。所以链接不是很可靠。
  • 啊,唉。我只是指出了第一个谷歌结果,我绝对不是要推荐它作为权威来源。对不起,如果我暗示它是有效的。
【解决方案5】:

Swift 版本,代码改编自 Valentyn 的回答(在 Swift 4.1 上测试):

func formattedCurrency(amount: Double, locale: Locale) -> String? {
    let formatter = NumberFormatter()
    formatter.locale = locale
    formatter.maximumFractionDigits = 2
    formatter.minimumFractionDigits = 2
    formatter.alwaysShowsDecimalSeparator = true
    formatter.numberStyle = .currency
    return formatter.string(from: NSNumber(value: amount))
}

它给出了一个不错的结果,尽管它没有正确更改所有语言环境的货币符号的位置,尽管原始答案中写了什么。但这就是 Apple 想要的样子,就这样吧。

澳元显示为原始问题询问,为“$1.50”。

【讨论】:

    【解决方案6】:

    如果需要,您可以创建一个包含货币的.strings 文件,并使用NSLocalizedString 函数创建本地化货币。像这样的:

    en.lproj
    myApp.strings:
    
    "currencySymbol"="$"
    "currencyFormat"="$%lf"
    
    au_AU.lproj
    myApp.strings:
    
    "currencySymbol"="$"
    "currencyFormat"="$%lf"
    
    ja_JP.lproj
    myApp.strings:
    
    "currencySymbol"="¥"
    "currencyFormat"="¥%lf"
    

    并像这样使用它:

    NSString *money = [NSString stringWithFormat:@"%@%lf", NSLocalizedString:(@"currencySymbol"), myMoney];
    

    但是,这意味着对于您支持的每个本地化,您都需要一个.strings 文件。此外,这意味着对于某些本地化,货币符号不足以显示正确的货币格式,您需要使用以下内容:

    NSString *money = [NSString stringWithFormat:NSLocalizedString(@"CurrencyFormat"), myMoney];
    

    这有一些限制,但它可能对你有用。

    【讨论】:

    • 感谢您的解决方案。它可能有效,但现在看起来 Matthew Frederick 的解决方案要容易得多 - 我的数据库中已经有一个货币表,所以我只需添加一个带有当地货币符号的列。在我的情况下,这看起来更容易。看起来没有内置的解决方案。
    【解决方案7】:

    您能否获取当前字符串并将其去除所有 a-Z 字符? 如果结果字符串的长度 > 0,那么你就得到了你的符号。否则使用原始字符串。

    这很俗气,我不确定这是否适用于全球所有货币,但它可能有效吗?

    【讨论】:

    • 不,这行不通。以下是流通货币列表:฿·Br·₵·¢·C$·₡·B/。 · ден。 · ₫ · € · ƒ · Ft · ₲ · Kč · ₭ · L · £ / ₤ · ₥ · ₦ · ₱ · P · R · RM · RSD · · ₨ · р. ·S/。 ·৳·R$·$···₮·₩·¥·zł·₴·Q·₪·TL。 en.wikipedia.org/wiki/Currency_sign
    • 什么更脏?使用有效货币符号列表。如果是其中之一,请使用它。否则删除所有 a-Z 字符。
    • 在我的特殊情况下,正如我上面提到的,创建一个列表“CODE -> LOCAL_SYMBOL”要方便得多。看来,我得这样解决我的问题了。
    • 不用担心 :) 很高兴您找到了解决方案。您是否将其作为错误报告给 Apple?
    • 不,我没有。会做。谢谢:)
    猜你喜欢
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多