web-dev-qa-db-ja.com

プログラムでiPhoneのロケール通貨を見つける

ユーザーのiphoneの通貨ロケールをプログラムで調べたい。つまり、ユーザーがUSストアにいる場合、通貨ロケールはUSDである必要があり、オーストラリアの場合はAUDである必要があります。このタスクの私の目的は、アプリにリストされているアイテムの価格を、AppStoreが求める価格とほぼ一致するように変換することです。

たとえば、ビデオ3 USDを販売していて、オーストラリア人がそれを購入したい場合、アプリ画面に2.8 AUDを表示する必要があります。それは、ユーザーの国での実際の価格よりもユーザーの計算を減らします。誰もそれを行う方法を知っていますか?

54
vodkhang

ほとんどの場合、通貨記号では不十分です。たとえば、ドイツでは価格を1,99€と書きますが、米国の人々は1.99ドルを使用します。文字列には3つの違いがあります。通貨記号、その位置、および区切り記号。

正しく実行したい場合は、NSNumberFormatterを使用する必要があります。通貨形式間のすべての違いを処理します。そして、それはあなたよりもはるかに優れています。サポートしたい4つの主要通貨だけでなく、すべての通貨で実行されるためです。

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[formatter setLocale:[NSLocale currentLocale]];
NSString *localizedMoneyString = [formatter stringFromNumber:myCurrencyNSNumberObject];

これをアプリの購入に使用する場合、ユーザーの現在のロケールに依存することはできません。DE(ドイツ語)ロケールのデバイスで米国ベースのアカウントを使用できるためです。また、アイテムの価格(ドイツでは実際の価格は0,79€)は、0,99€と表示されます(米国では$ 0.99であるため)。これは間違っているでしょう。アプリストアからローカライズされた価格をすでに取得しているため、独自に計算を行う必要はありません。
そしてSKProductsごとに価格とpriceLocaleを取得します。

次のような正しい形式の通貨文字列を取得します。

SKProduct *product = [self.products objectAtIndex:indexPath.row];
NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[formatter setLocale:product.priceLocale];
currencyString = [formatter stringFromNumber:product.price];

編集:通貨コードを特に要求したため。

NSString *currencyCode = [formatter currencyCode];で取得できます。これにより、ISO 4217に準拠した通貨コードが得られます。AUD、USD、EURなど。

127
Matthias Bauch

これらのキーを使用して、ロケールから通貨記号/コードを抽出しました

NSLocale *theLocale = [NSLocale currentLocale];
NSString *symbol = [theLocale objectForKey:NSLocaleCurrencySymbol];
NSString *code = [theLocale objectForKey:NSLocaleCurrencyCode];
46
tsakoyan
create macro first then use it
#define CURRENCY_SYMBOL [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol]

NSLog(@"%@ %.2f",CURRENCY_SYMBOL,25.50);
5
Hardik Darji

アプリで以下のコードを使用して、現地通貨記号を取得し、区切り文字を見つけました。私はあなたを助ける、

NSDecimalNumber *amount = [NSDecimalNumber decimalNumberWithString:@"50.00"];
NSNumberFormatter *currencyFormat = [[NSNumberFormatter alloc] init];
NSLocale *locale = [NSLocale currentLocale];
[currencyFormat setNumberStyle:NSNumberFormatterCurrencyStyle];
[currencyFormat setLocale:locale];
NSLog(@"Amount with symbol: %@", [currencyFormat stringFromNumber:amount]);//Eg: $50.00
NSLog(@"Current Locale : %@", [locale localeIdentifier]);//Eg: en_US

ありがとう。

5
Yuvaraj.M

SwiftでのMatthias Bauchの回答:

var formatter = NSNumberFormatter()
    formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
    formatter.locale = product!.priceLocale
var currencyString = "\(formatter.stringFromNumber(product!.price)!)"
3
ZiggyST

ご回答有難うございます。最終的に、価格と通貨コードをAppleから直接取得できることがわかりました。

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {    
    NSArray *products = response.products;
    if (products && products.count != 0) {
        product = [products objectAtIndex:0];
        [[NSNotificationCenter defaultCenter] postNotificationName:PRICE_UPDATED object:product.LocalizedPrice];    
    } 

    // finally release the reqest we alloc/init’ed in requestProUpgradeProductData
    [productsRequest release];
}



@implementation SKProduct (LocalizedPrice)

- (NSString *)LocalizedPrice
{
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
    [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    [numberFormatter setLocale:self.priceLocale];
    NSString *formattedString = [numberFormatter stringFromNumber:self.price];
    [numberFormatter release];
    return formattedString;
}

@end
1
vodkhang