如何从 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 中的货币代码中获取货币符号?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:如何从Objective-C中的货币符号字符串中获取数字

使用swift从货币代码中获取货币符号

带有可能符号的货币列表 - iPhone 应用程序开发

如何在 iPhone 中刷新 NSLocale?

3 位货币代码到货币符号

如何使用 XSLT 从 XML 中删除货币符号?