iPhone:如何获得本地货币符号(即“$”而不是“AU $”)

时间:2010-12-13 10:04:08

标签: iphone objective-c formatting currency

以下是我现在如何获得货币符号的代码:

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 $)对于澳大利亚)。所以,问题是如何获得LOCAL货币符号。有什么想法吗?

提前致谢。

7 个答案:

答案 0 :(得分:20)

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欧元等。

答案 1 :(得分:12)

此代码段返回区域设置“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。

答案 2 :(得分:10)

您的代码应该有效,但区域设置标识符是错误的。它应该是“en_AU”。

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

答案 3 :(得分:9)

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

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

*注意:链接无意具有权威性,请参阅评论。

答案 4 :(得分:1)

如果需要,您可以创建包含货币的.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];

这有一些限制,但它可能适合你。

答案 5 :(得分:1)

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 :(得分:0)

你可以获取当前字符串并删除所有a-Z字符吗? 如果得到的字符串长度> 0然后你就有了你的符号。否则使用原始字符串。

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