web-dev-qa-db-ja.com

iPhoneの通貨コードから通貨記号を取得するにはどうすればよいですか?

Webサービスの応答から通貨コード(例:USD、EUR、INR)を取得しました。対応する通貨コードの通貨記号を表示する必要があります。通貨コードがUSDの場合は$を表示する必要があり、通貨コードがEURの場合は€を表示する必要があります。これどうやってするの?これを行うためのアイデアやサンプルコードを提案してください。私を助けてください。前もって感謝します。

23
Yuvaraj.M

このコードは私のプロジェクトで魅力的に機能します。これを皆さんに共有します。

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

ありがとう。

17
Yuvaraj.M

このコードは、ロケールのループのためにあまり効率的ではありませんが、探しているものです。それでも動作します正しく 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];
14

Swift4バージョン

通貨コードによるロケールの検索:

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のロケールを作成するのに無駄になっています:) With .lazyそこで、最初に一致したもので自動的に停止します。私の場合、「GBP」を変換するときに、ループを通過する回数が710回から22回に減少します。これを1回だけ実行する場合、これは重要ではありませんが、これを複数回(つまり、シンボルの配列に対して)実行する場合は、もう少し効率を上げる簡単な方法です。

13
AKM

NSLocaleは、特定のロケールで使用される通貨記号を喜んで教えてくれます。

[locale objectForKey:NSLocaleCurrencySymbol];

また、通貨コードも表示されます。

[locale objectForKey:NSLocaleCurrencyCode];

したがって、今やらなければならないのは、特定のコードに対応するロケールを検索することだけです。これを直接行うための組み込みメソッド(私が知っている)はないので、すべての既知のロケールをループして、一致するものを選択します。 @Umkaの answer は、-findLocaleByCurrencyCode:メソッドでこの良い例を示しています。

毎回すべてのロケールを繰り返すのではなく、独自のルックアップテーブルを作成することでプロセスを最適化できます。通貨コードが重複する可能性も処理する必要がある場合があります。これには、最も可能性の高いロケールを決定するためのヒューリスティックが必要になります。

10
Mike Abdullah

@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
}
4
blwinters
NSNumberFormatter * formatter = [NSNumberFormatter new];
formatter.numberStyle = NSNumberFormatterCurrencyStyle;

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

NSString * symbol = formatter.currencySymbol;
3
Sandro Vezzali

Swift

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

1つの方法は、有効なロケール(ユーザーの現在のロケールなど)から始めて、通貨コードを上書きすることです。シンプルで効率的で、新しく構築されたロケールを使用して通貨フォーマッターを構成し、ユーザーのロケール設定に従って文字列を表示できます。

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;
0
Evtim Georgiev