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

问题描述:

我已经从webservice响应中获得货币代码(例如:USD,EUR,INR)。我需要显示相应货币代码的货币符号。如果货币代码是美元,我需要显示$,如果货币代码是EUR,我需要显示€。我怎样才能做到这一点?请提出任何想法或示例代码来做到这一点。请帮帮我。提前致谢。如何从iphone中的货币代码获取货币符号?

此代码的魅力在我的项目。我会分享给大家。

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

谢谢。

+3

我不认为这个代码按需要工作。它仅显示欧元和美元的正确货币符号。对于所有其他货币,它显示货币代码的第一个字符。 – 2012-07-18 08:28:51

+0

这段代码看起来很神奇,不清楚它为什么会这样做。如果您更改第三行以便输出'[locale objectForKey:NSLocaleCurrencySymbol]',则输出将打印'Currency Symbol:¤'。 – dteoh 2014-05-09 01:27:47

+2

此代码只适用于欧元和美元,其他人不适合我。 – 2015-03-17 16:32:43

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

这是美国的货币风格

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

这是印度

+0

感谢您的回复。你能清楚地告诉我吗?我无法理解你的答案。别误会我。谢谢。 – 2012-01-03 13:19:48

此代码是您正在寻找的,但由于语言环境的循环效率不高而效率不高。对于所有货币代码,它仍然正确运行,而不仅仅是欧元或美元。希望这会帮助你。

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

此代码有一些令人讨厌的缺陷:如果'NSNumberFormatter'决定不将货币符号放在输出中,那么您将得到不正确的结果。如果货币符号恰好占用多个UTF-16码位,它将被切断并且无效 – 2013-10-02 12:05:56

+0

改进它并允许其他人使用。这不是关于这个网站吗? ),谢谢。 – 2013-10-02 12:08:13

+0

确实。改进的答案已发布。 – 2013-10-03 14:42:37

NSLocale会很乐意告诉你一个特定的语言环境中使用的货币符号:

[locale objectForKey:NSLocaleCurrencySymbol]; 

它也将告诉你的货币代码:

[locale objectForKey:NSLocaleCurrencyCode]; 

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

您可以通过构建自己的查找表来优化流程,而不是每次遍历所有语言环境。您可能还需要处理重复货币代码的可能性,因此需要采取一些启发式方法来确定哪些是最可能的区域设置。从@Mike阿卜杜拉和@Umka代码

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

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

NSString * symbol = formatter.currencySymbol; 

大厦,这里是斯威夫特的一些功能。

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 
} 

斯威夫特4版

查找由货币代码的语言环境:

let localeGBP = Locale 
        .availableIdentifiers 
        .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 
} 

斯威夫特

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