40

iPhone アプリのアプリ内購入を行っています。

UILabel にユーザーの現地通貨で価格を表示したい。このためには、変数に価格と通貨が必要です。

SKPayment を使用して通貨を含む価格を取得するにはどうすればよいですか? (SKPayment がこの用途に適している場合。)

以下を使用して製品をインスタンス化しています。

SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"Identifier"];

フィードバックをお寄せいただきありがとうございます。

4

5 に答える 5

120

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ます。

于 2010-05-24T20:58:54.930 に答える
9

その情報を特定する正しい方法は、オブジェクトを使用することです。このオブジェクトは、初期化されたへの呼び出し後にデリゲートに返されSKProductたオブジェクトから取得されます。このようなもの:SKProductResponse- (void) startSKProductsRequest

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;
    }
}
于 2010-05-24T03:12:03.317 に答える
3

これが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
  }
}
于 2016-09-11T00:35:15.147 に答える