如何从 iPhone 中的货币代码中获取货币符号?
Posted
技术标签:
【中文标题】如何从 iPhone 中的货币代码中获取货币符号?【英文标题】:How can i get currency symbols from currency code in iphone? 【发布时间】:2012-02-01 12:26:33 【问题描述】:我从网络服务响应中获得了货币代码(例如:美元、欧元、印度卢比)。我需要显示相应货币代码的货币符号。如果货币代码是 USD,我需要显示 $,如果货币代码是 EUR,我需要显示 €。我怎样才能做到这一点?请提出任何想法或示例代码来执行此操作。请帮我。提前致谢。
【问题讨论】:
【参考方案1】:这段代码在我的项目中很有魅力。我会把这个分享给大家。
NSString *currencyCode = @"EUR";
NSLocale *locale = [[[NSLocale alloc] initWithLocaleIdentifier:currencyCode] autorelease];
NSString *currencySymbol = [NSString stringWithFormat:@"%@",[locale displayNameForKey:NSLocaleCurrencySymbol value:currencyCode]];
NSLog(@"Currency Symbol : %@", currencySymbol);
谢谢。
【讨论】:
我认为这段代码不能按预期工作。它只为 eur 和 usd 显示正确的货币符号。对于所有其他货币,它显示货币代码的第一个字符。 这段代码看起来很神奇,不清楚它为什么会这样做。如果您更改第三行使其打印[locale objectForKey:NSLocaleCurrencySymbol]
,则输出将打印Currency Symbol : ¤
。
此代码仅适用于欧元和美元,其他代码不适用于我。
第二行也是错误的。奇怪的是它有效。应该是:NSLocale *locale = [NSLocale currentLocale]
。 currencyCode
不等于语言环境标识符。
这不是正确答案,如前所述 localeIdentifier 与 currencyCode 不匹配【参考方案2】:
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。如果您只执行一次,这并不重要,但如果您多次执行此操作(即在一组符号上),那么这是一种提高效率的简单方法。
【讨论】:
为什么要查找本地并迭代?你可以只创建一个本地 NSLocale(localeIdentifier: "GBP") @carmen_munich NSLocale(localeIdentifier:) 采用区域设置标识符字符串(例如“en_GB”)。不是货币代码。 在我看来这是正确的答案,我使用了上面的代码并且完美地满足了我的需求:验证代表货币的字符串(ISO 代码格式)在所有代码中都有效。谢谢 不幸的是,这在 Swift 5.1 下不会产生可靠的结果。搜索货币代码为USD
的区域设置会返回标识符为 es_EC
的区域设置。
@TonyArnold 实际上是正确的 es_EC
是厄瓜多尔的西班牙语语言环境。厄瓜多尔恰好使用美元。【参考方案3】:
此代码是您正在寻找的代码,尽管由于语言环境的循环而效率不高。它仍然正确适用于所有货币代码,而不仅仅是 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 时,例如法国和荷兰有保存货币符号 - €,但它在法国写成 1,00 €荷兰 1,00 欧元。所以你会得到首先发现的任何 NSLocale。
这个等价物在 Swift 中不起作用。我不得不将你的代码移植到一个 Objective-C 桥中,并且由于某种原因它起作用了。虚幻。谢谢。【参考方案4】:
NSLocale
会很高兴地告诉您特定语言环境使用的货币符号:
[locale objectForKey:NSLocaleCurrencySymbol];
它还会告诉你货币代码:
[locale objectForKey:NSLocaleCurrencyCode];
因此,您现在要做的就是查找与给定代码对应的语言环境。没有内置方法(我知道)可以直接执行此操作,因此请遍历所有已知的语言环境并选择匹配的语言环境。 @Umka 的 answer 在 -findLocaleByCurrencyCode:
方法中有一个很好的例子。
您可以通过构建自己的查找表来优化流程,而不是每次都遍历所有语言环境。您可能还需要处理重复货币代码的可能性,这需要一些启发式方法来确定最有可能的语言环境。
【讨论】:
【参考方案5】:基于@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
【讨论】:
这段代码随着时间的推移发生了很多变化。但是 xcode 能够解决所有问题。效果很好【参考方案6】:NSNumberFormatter * formatter = [NSNumberFormatter new];
formatter.numberStyle = NSNumberFormatterCurrencyStyle;
NSString * localeIde = [NSLocale localeIdentifierFromComponents:@NSLocaleCurrencyCode: currencyCode];
formatter.locale = [NSLocale localeWithLocaleIdentifier:localeIde];
NSString * symbol = formatter.currencySymbol;
【讨论】:
【参考方案7】:一种方法是从有效的语言环境(例如用户当前的语言环境)开始,然后覆盖货币代码。简单高效,并允许您使用新构建的语言环境来配置货币格式化程序,以便根据用户的语言环境偏好显示字符串:
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;
【讨论】:
【参考方案8】:NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
这是美国货币样式
NSNumberFormatter *numberFormatter = [[[NSNumberFormatter alloc] init] autorelease];
//[numberFormatter setCurrencySymbol:@"Rs"];
[numberFormatter setNumberStyle:@"en_IN"];
这是给印度人的
【讨论】:
感谢您的回复。你能告诉我清楚吗?我无法理解你的回答。不要误会我。谢谢。【参考方案9】:斯威夫特
let locale = NSLocale(localeIdentifier: currencyCode)
let currencySymbol = locale.displayName(forKey: .currencySymbol, value: currencyCode) ?? currencyCode
print("Currency symbol: \(currencySymbol)")
【讨论】:
正如@cynichniy-bandera 之前提到的,此代码仅适用于欧元和美元。以上是关于如何从 iPhone 中的货币代码中获取货币符号?的主要内容,如果未能解决你的问题,请参考以下文章