2012-06-08 209 views
4

在本地化中,像我這樣的新手也有類似的問題,但我找不到一個能幫我實現這個技巧的人。根據ISOCountryCode獲取貨幣符號和貨幣代碼

這裏是我的問題。我們可以通過表格[NSLocale ISOCountryCodes]的聲明獲取NSArray中的所有ISO國家代碼。現在,我希望打印當地貨幣的每個國家以及該國使用的貨幣代碼。這樣做的適當方式是什麼?

我也不會在這個意義上,我得到的形式 美國線條美的工作如下:(空)((空)) 的時候,而不是我想獲得的形式 和美的系美國:$(USD):

myCountryCode = [[NSLocale ISOCountryCodes] objectAtIndex:row]; 
appLocale = [[NSLocale alloc] initWithLocaleIdentifier: @"en_US"]; 
identifier = [NSLocale localeIdentifierFromComponents: [NSDictionary 
         dictionaryWithObject: myCountryCode 
            forKey: NSLocaleCountryCode]]; 
myDictionary = [NSLocale componentsFromLocaleIdentifier: identifier]; 
myCountryName = [appLocale displayNameForKey:NSLocaleCountryCode 
             value:[myDictionary 
              objectForKey:NSLocaleCountryCode]]; 
localCurrencySymbol = [appLocale displayNameForKey:NSLocaleCurrencySymbol 
         value:[myDictionary objectForKey:NSLocaleCurrencySymbol]]; 
currencyCode = [appLocale displayNameForKey:NSLocaleCurrencyCode 
       value: [myDictionary objectForKey:NSLocaleCurrencyCode]]; 
title = [NSString stringWithFormat:@"%@ %@: %@ (%@)", myCountryCode, myCountryName, localCurrencySymbol, currencyCode]; 
[appLocale release]; 

(以上標識,myCountryCode,myCountryName,localCurrencySymbol,CURRENCYCODE和標題都是NSString的指針,而且myDictionary是一個NSDictionary指針和AppLocale會是一個NSLocale指針。)。基本上,上面的代碼將在pickerview中,我想要即時生成每行的標題。

非常感謝您的時間。基本上問題是,一旦我們擁有ISO國家代碼,我們如何打印(在應用程序區域中)該特定國家的貨幣符號和貨幣代碼。

+1

你能具體談談「不工作」?它是否會崩潰,你有沒有預料到的事情清單,是否有太少的條目?不要讓我們猜測。 – gaige

+0

謝謝。我更新了我的帖子。基本上問題是,一旦我們擁有ISO國家代碼,我們如何打印(在應用程序區域中)該特定國家的貨幣符號和貨幣代碼。 – MightyMouse

回答

5

試試下面的測試程序,並根據需要

#import <Foundation/Foundation.h> 

int main(int argc, char *argv[]) { 
    NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init]; 

    // select an arbitrary locale identifier; you could use your row index but your 
    // indexing scheme would be different 
    NSString *localeIdentifier = [[NSLocale availableLocaleIdentifiers] objectAtIndex:72]; 
    // get the selected locale and the application locale 
    NSLocale *selectedLocale = [[NSLocale alloc] initWithLocaleIdentifier:localeIdentifier]; 
    NSLocale *appLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
    // country code and name (in app's locale) 
    NSString *countryCode = [selectedLocale objectForKey:NSLocaleCountryCode]; 
    NSString *countryName = [appLocale displayNameForKey:NSLocaleCountryCode value:countryCode]; 
    // symbol and currency code 
    NSString *localCurrencySymbol = [selectedLocale objectForKey:NSLocaleCurrencySymbol]; 
    NSString *currencyCode = [selectedLocale objectForKey:NSLocaleCurrencyCode]; 
    NSString *title = [NSString stringWithFormat:@"%@ %@: %@ (%@)", countryCode, countryName, localCurrencySymbol, currencyCode]; 
    [appLocale release]; 

    NSLog(@"title = %@",title); 

    [p release]; 
} 

這適應記錄以下控制檯:

2012-06-09 06:01:08.299 Untitled 2[11668:707] title = ES Spain: € (EUR) 
+0

的NSString * localCurrencySymbol = [selectedLocale objectForKey:NSLocaleCurrencySymbol]; 和 的NSString * CURRENCYCODE = [selectedLocale objectForKey:NSLocaleCurrencyCode];是我的鑰匙。謝謝。 –

+0

有沒有辦法讓一個貨幣代碼的描述性名稱?像印度盧比代表「印度盧比」,美元代表「美元」等。 –

+0

,我不知道任何可可API本的... – FluffulousChimp

5

我覺得這裏的問題是,你期待的是componentsFromLocaleIdentifer將返回信息關於語言環境。相反,它返回有關作爲標識符傳入的字符串的信息。雖然您可以接收NSLocalCurrencySymbol,但只有當您傳入的字符串具有特定貨幣的覆蓋(這種情況絕不會發生在您的情況中,因爲您只使用標準數組)時纔會出現。這種情況的一個例子是建立了一個FR系統但用美元貨幣的用戶。

通常,您不應使用-displayNameForKey:value:作爲NSLocaleCurrencyCodeNSLocaleCurrencySymbol,因爲它們都返回國際字符串,而不是本地化字符串。因此,一旦你有了首選的本地服務,你應該能夠通過使用-objectForKey:獲得這些信息。

在我測試中,棘手的部分是假設列表中的語言環境足以創建有效的貨幣代碼並且符號不是真實的,您需要擁有語言和國家/地區代碼。幸運的是,+[NSLocale canonicalLanguageIdentifierFromString:]將爲您提供正確的語言,然後您可以將其附加到國家/地區代碼(在_之後)以創建適當地導致檢索貨幣信息的國家/語言字符串。

這裏是我修改後的代碼:

myCountryCode = [[NSLocale ISOCountryCodes] objectAtIndex:row]; 
appLocale = [[NSLocale alloc] initWithLocaleIdentifier: @"en_US"]; 
identifier = [NSLocale localeIdentifierFromComponents: [NSDictionary 
     dictionaryWithObject: myCountryCode 
     forKey: NSLocaleCountryCode]]; 
myDictionary = [NSLocale componentsFromLocaleIdentifier: identifier]; 
myCountryName = [appLocale displayNameForKey:NSLocaleCountryCode 
     value:[myDictionaryobjectForKey:NSLocaleCountryCode]]; 

// Create the currency language combination and then make our locale 
NSString *currencyLocaleLanguage= [NSLocale canonicalLanguageIdentifierFromString: myCountryCode]; 
NSString *countryLanguage= [NSString stringWithFormat: @"%@_%@", myCountryCode, currencyLocaleLanguage]; 
NSLocale *currencyLocale = [[NSLocale alloc] initWithLocaleIdentifier: countryLanguage]; 

localCurrencySymbol = [currencyLocale objectForKey:NSLocaleCurrencySymbol]; 
currencyCode = [currencyLocale objectForKey:NSLocaleCurrencyCode]; 

title = [NSString stringWithFormat:@"%@ %@: %@ (%@)", myCountryCode, myCountryName, localCurrencySymbol, currencyCode]; 
[currencyLocale release]; 
[appLocale release]; 
9

對於任何人只是想獲得由3個字母的ISO代碼(commonISOCurrencyCodes)的貨幣代碼。你可以簡單地做到這一點。

NSString *localeId = @"JPY"; //[[NSLocale commonISOCurrencyCodes] objectAtIndex:1]; 
NSLocale *locale = [NSLocale currentLocale]; 
NSString *currency = [locale displayNameForKey:NSLocaleCurrencySymbol 
             value:localeId]; 
NSLog(@"locale %@ currency %@", localeId, currency); 

打印。

locale JPY currency ¥