【问题标题】:How can i get currency symbols from currency code in iphone?如何从 iPhone 中的货币代码中获取货币符号?
【发布时间】:2012-02-01 12:26:33
【问题描述】:

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

【问题讨论】:

    标签: cocoa currency symbols


    【解决方案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 之前提到的,此代码仅适用于欧元和美元。
          猜你喜欢
          • 2014-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-12
          • 1970-01-01
          • 2019-08-27
          • 1970-01-01
          相关资源
          最近更新 更多