如何从iphone中的货币代码中获取货币符号?

时间:2012-01-03 13:02:30

标签: cocoa currency symbols

我从网络服务响应中获得了货币代码(例如:USD,EUR,INR)。我需要显示相应货币代码的货币符号。如果货币代码是美元,我需要显示$,如果货币代码是欧元我需要显示€。我怎样才能做到这一点?请提出任何想法或示例代码来执行此操作。请帮我。提前谢谢。

9 个答案:

答案 0 :(得分:18)

此代码在我的项目中具有魅力。我将分享给大家。

NSString *currencyCode = @"EUR";
    NSLocale *locale = [[[NSLocale alloc] initWithLocaleIdentifier:currencyCode] autorelease];
    NSString *currencySymbol = [NSString stringWithFormat:@"%@",[locale displayNameForKey:NSLocaleCurrencySymbol value:currencyCode]];
    NSLog(@"Currency Symbol : %@", currencySymbol);

感谢。

答案 1 :(得分:15)

这个代码是你正在寻找的,虽然因为语言环的循环而效率不高。对于所有货币代码仍然正常正确,而不仅仅是欧元或美元。希望这会对你有所帮助。

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

答案 2 :(得分:13)

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?没有它,循环将遍历所有区域设置标识符并返回匹配的第一个。这是大约700个标识符,如果第一个是您想要的那个,那么您浪费了创建699个区域设置:)在.lazy处,它会自动停在第一个匹配的区域。在我的情况下,当转换“GBP”时,它将循环的次数从710减少到22。如果你只是这样做一次,这并不重要,但如果你这样做了很多次(即在符号数组上),那么这是一种提高效率的简单方法。

答案 3 :(得分:10)

NSLocale会很高兴地告诉您特定区域设置使用的货币符号:

[locale objectForKey:NSLocaleCurrencySymbol];

它还会告诉您货币代码:

[locale objectForKey:NSLocaleCurrencyCode];

所以你现在要做的就是查找与给定代码对应的语言环境。没有内置方法(我知道)直接执行此操作,因此遍历所有已知语言环境并选择匹配的语言环境。 @ Umka的answer-findLocaleByCurrencyCode:方法中有一个很好的例子。

您可以通过构建自己的查找表来优化流程,而不是每次都遍历所有语言环境。您可能还需要处理重复货币代码的可能性,这需要一些启发式方法来决定哪个是最可能的区域设置。

答案 4 :(得分:4)

以@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
}

答案 5 :(得分:3)

NSNumberFormatter * formatter = [NSNumberFormatter new];
formatter.numberStyle = NSNumberFormatterCurrencyStyle;

NSString * localeIde = [NSLocale localeIdentifierFromComponents:@{NSLocaleCurrencyCode: currencyCode}];
formatter.locale = [NSLocale localeWithLocaleIdentifier:localeIde];

NSString * symbol = formatter.currencySymbol;

答案 6 :(得分:0)

夫特

let locale = NSLocale(localeIdentifier: currencyCode)
let currencySymbol = locale.displayName(forKey: .currencySymbol, value: currencyCode) ?? currencyCode
print("Currency symbol: \(currencySymbol)")

答案 7 :(得分:0)

一种方法是从有效的语言环境(例如用户当前的语言环境)开始,然后覆盖货币代码。简单高效,并且允许您使用新构造的语言环境来配置货币格式程序,以便根据用户的语言环境首选项显示字符串:

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

NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
    [currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];

这适用于美国货币风格

NSNumberFormatter *numberFormatter = [[[NSNumberFormatter alloc] init] autorelease];
    //[numberFormatter setCurrencySymbol:@"Rs"];        
    [numberFormatter setNumberStyle:@"en_IN"];

这是印度人的