【发布时间】:2012-02-01 12:26:33
【问题描述】:
我从网络服务响应中获得了货币代码(例如:美元、欧元、印度卢比)。我需要显示相应货币代码的货币符号。如果货币代码是 USD,我需要显示 $,如果货币代码是 EUR,我需要显示 €。我怎样才能做到这一点?请提出任何想法或示例代码来执行此操作。请帮我。提前致谢。
【问题讨论】:
我从网络服务响应中获得了货币代码(例如:美元、欧元、印度卢比)。我需要显示相应货币代码的货币符号。如果货币代码是 USD,我需要显示 $,如果货币代码是 EUR,我需要显示 €。我怎样才能做到这一点?请提出任何想法或示例代码来执行此操作。请帮我。提前致谢。
【问题讨论】:
这段代码在我的项目中很有魅力。我会把这个分享给大家。
NSString *currencyCode = @"EUR";
NSLocale *locale = [[[NSLocale alloc] initWithLocaleIdentifier:currencyCode] autorelease];
NSString *currencySymbol = [NSString stringWithFormat:@"%@",[locale displayNameForKey:NSLocaleCurrencySymbol value:currencyCode]];
NSLog(@"Currency Symbol : %@", currencySymbol);
谢谢。
【讨论】:
[locale objectForKey:NSLocaleCurrencySymbol],则输出将打印Currency Symbol : ¤。
NSLocale *locale = [NSLocale currentLocale]。 currencyCode 不等于语言环境标识符。
Swift 4 版本
按货币代码查找区域设置:
let localeGBP = Locale
.availableIdentifiers
.lazy
.map { Locale(identifier: $0) }
.first { $0.currencyCode == "GBP" }
print(localeGBP?.currencySymbol) // £
格式化货币
if let locale = localeGBP {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = locale
let result = formatter.string(from: 100000) // £100,000.00
}
编辑:
为什么是.lazy?没有它,循环将遍历 all 语言环境标识符并返回第一个匹配的标识符。大约有 700 个标识符,如果第一个是您想要的,那么您就浪费了创建 699 个区域设置 :) 使用.lazy,它会自动停止在第一个匹配的位置。就我而言,它在转换“GBP”时将循环次数从 710 减少到 22。如果您只执行一次,这并不重要,但如果您多次执行此操作(即在一组符号上),那么这是一种提高效率的简单方法。
【讨论】:
USD 的区域设置会返回标识符为 es_EC 的区域设置。
es_EC 是厄瓜多尔的西班牙语语言环境。厄瓜多尔恰好使用美元。
此代码是您正在寻找的代码,尽管由于语言环境的循环而效率不高。它仍然正确适用于所有货币代码,而不仅仅是 eur 或 usd。希望这会对你有所帮助。
- (NSLocale *) findLocaleByCurrencyCode:(NSString *)_currencyCode
{
NSArray *locales = [NSLocale availableLocaleIdentifiers];
NSLocale *locale = nil;
for (NSString *localeId in locales) {
locale = [[[NSLocale alloc] initWithLocaleIdentifier:localeId] autorelease];
NSString *code = [locale objectForKey:NSLocaleCurrencyCode];
if ([code isEqualToString:_currencyCode])
break;
else
locale = nil;
}
return locale;
}
- (NSString *)findCurrencySymbolByCode:(NSString *)_currencyCode
{
NSNumberFormatter *fmtr = [[NSNumberFormatter alloc] init];
NSLocale *locale = [self findLocaleByCurrencyCode:_currencyCode];
NSString *currencySymbol;
if (locale)
[fmtr setLocale:locale];
[fmtr setNumberStyle:NSNumberFormatterCurrencyStyle];
currencySymbol = [fmtr currencySymbol];
[fmtr release];
if (currencySymbol.length > 1)
currencySymbol = [currencySymbol substringToIndex:1];
return currencySymbol;
}
这样使用:
NSString *currencySymbol = [self findCurrencySymbolByCode:currencyCode];
【讨论】:
NSNumberFormatter 决定不在输出中首先放置货币符号,你会得到一个不正确的结果。如果货币符号恰好占用多个 UTF-16 代码点,它将被截断并无效
NSLocale 会很高兴地告诉您特定语言环境使用的货币符号:
[locale objectForKey:NSLocaleCurrencySymbol];
它还会告诉你货币代码:
[locale objectForKey:NSLocaleCurrencyCode];
因此,您现在要做的就是查找与给定代码对应的语言环境。没有内置方法(我知道)可以直接执行此操作,因此请遍历所有已知的语言环境并选择匹配的语言环境。 @Umka 的 answer 在 -findLocaleByCurrencyCode: 方法中有一个很好的例子。
您可以通过构建自己的查找表来优化流程,而不是每次都遍历所有语言环境。您可能还需要处理重复货币代码的可能性,这需要一些启发式方法来确定最有可能的语言环境。
【讨论】:
基于@Mike Abdullah 和@Umka 的代码,这里有一些Swift 函数。
func findCodeAndSymbolForAllLocales() {
let locales = NSLocale.availableLocaleIdentifiers()
for localeId in locales {
let locale = NSLocale(localeIdentifier: localeId)
if let code = locale.objectForKey(NSLocaleCurrencyCode) as? String,
let symbol = locale.objectForKey(NSLocaleCurrencySymbol) {
print("\(code) \(symbol)")
}
}
}
func findCurrencySymbolByCode(currencyCode:String) -> String? {
guard let locale = findLocaleByCurrencyCode(currencyCode) else {
print("locale for \(currencyCode) is nil")
return nil
}
return locale.objectForKey(NSLocaleCurrencySymbol) as? String
}
func findLocaleByCurrencyCode(currencyCode:String) -> NSLocale? {
let locales = NSLocale.availableLocaleIdentifiers()
var locale:NSLocale?
for localeId in locales {
locale = NSLocale(localeIdentifier: localeId)
if let code = locale!.objectForKey(NSLocaleCurrencyCode) as? String {
if code == currencyCode {
return locale
}
}
}
return locale
}
【讨论】:
NSNumberFormatter * formatter = [NSNumberFormatter new];
formatter.numberStyle = NSNumberFormatterCurrencyStyle;
NSString * localeIde = [NSLocale localeIdentifierFromComponents:@{NSLocaleCurrencyCode: currencyCode}];
formatter.locale = [NSLocale localeWithLocaleIdentifier:localeIde];
NSString * symbol = formatter.currencySymbol;
【讨论】:
一种方法是从有效的语言环境(例如用户当前的语言环境)开始,然后覆盖货币代码。简单高效,并允许您使用新构建的语言环境来配置货币格式化程序,以便根据用户的语言环境偏好显示字符串:
NSLocale* locale = [NSLocale currentLocale];
if (_currencyCode) {
NSMutableDictionary* components = [[NSLocale componentsFromLocaleIdentifier:locale.localeIdentifier] mutableCopy];
components[NSLocaleCurrencyCode] = _currencyCode;
locale = [[NSLocale alloc] initWithLocaleIdentifier:[NSLocale localeIdentifierFromComponents:components]];
}
return locale.currencySymbol;
【讨论】:
NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
这是美国货币样式
NSNumberFormatter *numberFormatter = [[[NSNumberFormatter alloc] init] autorelease];
//[numberFormatter setCurrencySymbol:@"Rs"];
[numberFormatter setNumberStyle:@"en_IN"];
这是给印度人的
【讨论】:
斯威夫特
let locale = NSLocale(localeIdentifier: currencyCode)
let currencySymbol = locale.displayName(forKey: .currencySymbol, value: currencyCode) ?? currencyCode
print("Currency symbol: \(currencySymbol)")
【讨论】: