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

问题描述 投票:27回答:7

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

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货币符号。有任何想法吗?

提前致谢。

iphone objective-c formatting currency
7个回答
10
投票

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

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


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


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。


9
投票

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

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

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


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];

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


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美元”。


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.