Yuv*_*j.M 23 cocoa symbols currency
我从网络服务响应中获得了货币代码(例如:USD,EUR,INR).我需要显示相应货币代码的货币符号.如果货币代码是美元,我需要显示$,如果货币代码是欧元我需要显示€.我怎样才能做到这一点?请提出任何想法或示例代码来执行此操作.请帮我.提前致谢.
Yuv*_*j.M 18
这段代码在我的项目中很有魅力.我将分享给大家.
NSString *currencyCode = @"EUR";
NSLocale *locale = [[[NSLocale alloc] initWithLocaleIdentifier:currencyCode] autorelease];
NSString *currencySymbol = [NSString stringWithFormat:@"%@",[locale displayNameForKey:NSLocaleCurrencySymbol value:currencyCode]];
NSLog(@"Currency Symbol : %@", currencySymbol);
Run Code Online (Sandbox Code Playgroud)
谢谢.
Cyn*_*era 15
这个代码是你正在寻找的,虽然效率不高,因为locales的循环.不过它的工作原理正确地对所有货币代码,不只是为欧元或美元.希望这会帮助你.
- (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;
}
Run Code Online (Sandbox Code Playgroud)
用这种方式:
NSString *currencySymbol = [self findCurrencySymbolByCode:currencyCode];
Run Code Online (Sandbox Code Playgroud)
AKM*_*AKM 14
Swift 4版
按货币代码查找区域设置:
let localeGBP = Locale
.availableIdentifiers
.lazy
.map { Locale(identifier: $0) }
.first { $0.currencyCode == "GBP" }
print(localeGBP?.currencySymbol) // £
Run Code Online (Sandbox Code Playgroud)
格式化货币
if let locale = localeGBP {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = locale
let result = formatter.string(from: 100000) // £100,000.00
}
Run Code Online (Sandbox Code Playgroud)
编辑:
为什么.lazy
?没有它,循环将遍历所有区域设置标识符并返回匹配的第一个区域标识符.这是大约700个标识符,如果第一个是您想要的那个,那么您浪费了创建699 Locales :) .lazy
在那里它会自动停止在第一个匹配的标识符.在我的情况下,当转换"GBP"时,它将循环的次数从710减少到22.如果你只这样做一次,这并不重要,但如果你这样做了很多次(即通过一系列符号),那么这是一种提高效率的简单方法.
Mik*_*lah 10
NSLocale
我们很乐意告诉您特定区域设置使用的货币符号:
[locale objectForKey:NSLocaleCurrencySymbol];
Run Code Online (Sandbox Code Playgroud)
它还会告诉你货币代码:
[locale objectForKey:NSLocaleCurrencyCode];
Run Code Online (Sandbox Code Playgroud)
所以你现在要做的就是查找与给定代码对应的语言环境.没有内置方法(我知道)直接执行此操作,因此遍历所有已知语言环境并选择匹配的语言环境.@ Umka的答案在-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
}
Run Code Online (Sandbox Code Playgroud)