web-dev-qa-db-ja.com

iPhone:現地通貨記号を取得する方法(つまり、「AU $」の代わりに「$」)

通貨記号を取得する方法のコードは次のとおりです。

NSLocale *lcl = [[[NSLocale alloc] initWithLocaleIdentifier:@"au_AU"] autorelease];
NSNumberFormatter *fmtr = [[[NSNumberFormatter alloc] init] autorelease];
[fmtr setNumberStyle:NSNumberFormatterCurrencyStyle];
[fmtr setLocale:lcl];

NSLog( @"%@", [lcl displayNameForKey:NSLocaleCurrencySymbol value:@"AUD"] );
NSLog( @"%@", [fmtr currencySymbol] );

どちらのNSLogも「AU $」を返します。 Apple開発ドキュメントから理解したように、通貨ごとに少なくとも2つの通貨記号があります(ただし、これらの記号は同じである可能性があります)-ローカル(国内で使用されます。オーストラリアの場合は$)など)と国際(オーストラリアの場合はAU $)なので、問題はどのように現地通貨記号を取得するかです。

前もって感謝します。

27
kovpas

コードは機能するはずですが、ロケール識別子が間違っています。 「en_AU」である必要があります。

「国際化およびローカリゼーションガイド」の「ロケールオブジェクトの使用」を参照してください( https://developer.Apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/InternationalizingLocaleData/InternationalizingLocaleData.html#// Apple_ref/doc/uid/10000171i-CH13-SW4

10
Nik
NSNumberFormatter *currencyFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[currencyFormatter setLocale:[NSLocale currentLocale]];
[currencyFormatter setMaximumFractionDigits:2];
[currencyFormatter setMinimumFractionDigits:2];
[currencyFormatter setAlwaysShowsDecimalSeparator:YES];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];

NSNumber *someAmount = [NSNumber numberWithFloat:5.00];    
NSString *string = [currencyFormatter stringFromNumber:someAmount];

米国は5.00ドル、日本は5.00円、ヨーロッパは5.00ユーロなどです。

20

このスニペットは、ロケール「ja_JP」(他の任意のロケールである可能性があります)の通貨記号¥を返します。

NSLocale* japanese_japan = [[[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"] autorelease];
 NSNumberFormatter* fmtr = [[[NSNumberFormatter alloc] init] autorelease];
 [fmtr setNumberStyle:NSNumberFormatterCurrencyStyle];
 [fmtr setLocale:japanese_japan];

 // Local currency symbol (what you're asking for)
 NSString* currencySymbol = [fmtr currencySymbol];
 NSLog( @"%@", currencySymbol ); // Prints '¥'

 // International currency symbol 
 NSString* internationalCurrencySymbol = [fmtr internationalCurrencySymbol];
 NSLog( @"%@", internationalCurrencySymbol ); // Prints 'JPY'

残念ながら、au_AUの場合、現地通貨記号として$だけでなくAU $が表示されますが、iOSでの表示方法と同じでなければなりません。ただし、au_AUに出力される国際記号はAU $ではなくAUDであることに注意してください。

12
Julio Gorgé

システムから出てこないという点では理想的ではありませんが、現在の通貨記号のリスト *を使用して独自の内部テーブルを作成できることは明らかです。そのリストにはUnicode記号が含まれているので、単にロケールのAppleリストとリストを照合するだけです。

アップルが提供したものに実際にアクセスできない場合に備えて、そうですね。

*注:信頼できるリンクではありません。コメントを参照してください。

9

Swiftバージョン、Valentynの回答を元にしたコード(Swift 4.1でテスト):

func formattedCurrency(amount: Double, locale: Locale) -> String? {
    let formatter = NumberFormatter()
    formatter.locale = locale
    formatter.maximumFractionDigits = 2
    formatter.minimumFractionDigits = 2
    formatter.alwaysShowsDecimalSeparator = true
    formatter.numberStyle = .currency
    return formatter.string(from: NSNumber(value: amount))
}

元の答えに何が書かれているかにかかわらず、すべてのロケールで通貨記号の位置が正しく変更されるわけではありませんが、それはまともな結果をもたらします。しかし、それがApple=になりたがっているので、そうです。

オーストラリアドルは、元の質問が要求するとおり、「$ 1.50」と表示されます。

1
Alex

必要に応じて、通貨を含む.stringsファイルを作成し、ローカライズされた通貨を作成するためにNSLocalizedString関数を使用できます。このようなもの:

en.lproj
myApp.strings:

"currencySymbol"="$"
"currencyFormat"="$%lf"

au_AU.lproj
myApp.strings:

"currencySymbol"="$"
"currencyFormat"="$%lf"

ja_JP.lproj
myApp.strings:

"currencySymbol"="¥"
"currencyFormat"="¥%lf"

そしてこれを次のように使用します:

NSString *money = [NSString stringWithFormat:@"%@%lf", NSLocalizedString:(@"currencySymbol"), myMoney];

ただし、これは、サポートするすべてのローカリゼーションについて、.stringsファイルが必要であることを意味します。また、これは、一部のローカリゼーションでは、通貨記号が適切な通貨形式を表示するのに十分ではなく、次のようなものを使用する必要があることを意味します。

NSString *money = [NSString stringWithFormat:NSLocalizedString(@"CurrencyFormat"), myMoney];

これにはいくつかの制限がありますが、うまくいくかもしれません。

1

現在の文字列を取得して、すべてのa-Z文字を取り除くことはできますか?結果の文字列の長さが0より大きい場合は、シンボルを取得しています。それ以外の場合は、元の文字列を使用します。

それは粘着性があり、これが世界中のすべての通貨でうまくいくかどうかはわかりませんが、うまくいくかもしれませんか?

0
mackross