IPhoneアプリのアプリ内購入を利用しています。
UILabelにユーザーの現地通貨で価格を表示したい。これには、変数の価格と通貨が必要です。
SKPaymentを使用して通貨を含む価格を取得するにはどうすればよいですか? (SKPaymentがこの用途に適している場合。)
私は以下を使用して製品をインスタンス化しています:
SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"Identifier"];
フィードバックをありがとうございました!
NSLocaleCurrencySymbol + price.stringValueを使用するだけでは問題があります。これは、さまざまなロケールの特殊性を処理しません。通貨記号を前に置くかどうか。ノルウェー、デンマーク、スウェーデン、スイスはすべて通貨を後に置きます。 17.00Kr。また、ヨーロッパのほとんどの国では、「。」の代わりに「、」を使用しています。小数の場合、 「2.99ユーロ」ではなく「2,99ユーロ」。
NSNumberFormatterを使用することをお勧めします。 Edが示したように、SKProductが返した「priceLocale」が鍵となります。それはNSNumberFormatterに価格を正しくフォーマットするための賢さを与えます。
Objective-Cカテゴリを使用してSKProductに新しいプロパティを追加することで、これを大幅に簡単にすることもできます。次の2つのファイルをプロジェクトに追加します。
SKProduct + priceAsString.h:
#import <Foundation/Foundation.h> #import <StoreKit/StoreKit.h> @interface SKProduct (priceAsString) @property (nonatomic, readonly) NSString *priceAsString; @end
SKProduct + priceAsString.m:
#import "SKProduct+priceAsString.h" @implementation SKProduct (priceAsString) - (NSString *) priceAsString { NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; [formatter setFormatterBehavior:NSNumberFormatterBehavior10_4]; [formatter setNumberStyle:NSNumberFormatterCurrencyStyle]; [formatter setLocale:[self priceLocale]]; NSString *str = [formatter stringFromNumber:[self price]]; [formatter release]; return str; } @end
次に、#import "SKProduct+priceAsString.h"
をコードで使用すると、product.priceAsString
コード内。
その情報を判別する正しい方法は、初期化されたSKProduct
で- (void) start
を呼び出した後にデリゲートに返されたSKProductResponse
オブジェクトから取得したSKProductsRequest
オブジェクトを使用することです。このようなもの:
SKProductsRequest *req = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"Identifier"]];
req.delegate = self;
[req start];
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse: (SKProductsResponse *)response {
[request autorelease];
if (response.products.count) {
SKProduct *product = [response.products objectAtIndex:0];
NSLocale *priceLocale = product.priceLocale;
NSDecimalNumber *price = product.price;
NSString *description = product.localizedDescription;
}
}
Swift extension
を使用した上記の回答のバージョン:
extension SKProduct {
func priceAsString() -> String {
let formatter = NSNumberFormatter()
formatter.formatterBehavior = .Behavior10_4
formatter.numberStyle = .CurrencyStyle
formatter.locale = self.priceLocale
return formatter.stringFromNumber(self.price)! as String
}
}
Swift 3.0のソリューションは次のとおりです
extension SKProduct {
func priceAsString() -> String {
let formatter = NumberFormatter()
formatter.formatterBehavior = .behavior10_4
formatter.numberStyle = .currency
formatter.locale = self.priceLocale
return formatter.string(from: self.price)! as String
}
}
計算されたプロパティを使用すると、[]を必要としないため、Objective-Cシナリオのコードが簡潔になります。
@objcパブリック拡張SKProduct {
var priceAsString: String? {
let formatter = NumberFormatter()
formatter.formatterBehavior = .behavior10_4
formatter.numberStyle = .currency
formatter.locale = self.priceLocale
formatter.string(from: self.price)
return formatter.string(from: self.price)
}
}
注:忘れないでくださいimport StoreKit