2010-05-24 14 views
38

iPhone uygulaması için Uygulama İçi Satın Alıyorum.SKPayment'te bir ürünün fiyatına nasıl erişilir?

Fiyatını, kullanıcıların yerel para biriminde bir UILabel'de göstermek istiyorum. Bunun için bir değişkende & para birimine ihtiyacım var.

SKPayment kullanarak para birimi de dahil olmak üzere fiyatı nasıl alabilirim? (SKPayment bu kullanım için doğruysa.)

Ben kullanarak ürünü başlatmasını ediyorum

:

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

görüşleriniz için şimdiden teşekkür ederiz!

cevap

116

sadece NSLocaleCurrencySymbol + price.stringValue kullanarak bir sorun var: bu örneğin farklı yerel, özelliklerinden söz işlemez. para sembolünü öne mi koyup koymadıkları. Norveç, Danimarka, İsveç ve İsviçre'nin hepsi para birimini, örneğin. 17.00Kr. Ayrıca, çoğu (?) Avrupa ülkesi 'yerine' yerine 'kullanır. ondalık, örneğin. "2,99 €" yerine "2,99 €".

NSNumberFormatter kullanmak daha iyi bir plandır. Ed'in gösterdiği gibi SKProduct'un döndürdüğü "priceLocale" anahtardır. NSNumberFormatter'ı bir fiyatı doğru şekilde biçimlendirmek için verir.

Ayrıca, bir Objective-C kategorisini kullanarak SKProduct'a yeni bir özellik ekleyerek bunu çok daha kolay hale getirebilirsiniz.


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 
projenize aşağıdaki iki dosya ekleme
Kodunuzdaki Sonra

, #import "SKProduct+priceAsString.h" ve sadece kodunda product.priceAsString kullanmak gerekir.

+1

Bu güzel bir çözüm, bunu eklediğiniz için teşekkürler! Cevabını çözümüne değiştirdim. – favo

+4

Bunu farklı para birimleriyle nasıl test edeceğinize dair bir fikriniz var mı? – knagode

+0

Her nasılsa bu bana "US $ " cevabı veriyor. Bunu iOS6'ya yükselttiğimde fark ettim, herhangi bir fikir neden? – schystz

9

bilgilerin hiçbir belirlemek için doğru bir şekilde bir başlatıldı SKProductsRequest üzerinde - (void) start bir çağrısının ardından temsilci geri SKProductResponse nesne alınan bir SKProduct nesne kullanmaktır. Böyle bir şey:

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; 
    } 
} 
+5

teşekkür unutmayın! Bu gibi kullanılır: myLabel.text = [NSString stringWithFormat ("bla maliyetleri% @% @" @ nil) NSLocalizedString [priceLocale objectForKey: NSLocaleCurrencySymbol], [fiyat stringValue]]; – favo

+1

İkinize de teşekkürler! ancak% 101 doğru olması için şunu kullanmalısınız: 'NSNumberFormatter * numberFormatter = [[NSNumberFormatter alloc] init];' '[numberFormatter setFormatterBehavior: NSNumberFormatterBehavior10_4];' [NumberFormatter setNumberStyle: NSNumberFormatterDecimalStyle]; 'myLabel.text = [NSString stringWithFormat: NSLocalizedString ("% @% @" @ nil) [NumberFormatter stringFromNumber: _price], [_priceLocale objectForKey: NSLocaleCurrencySymbol]]; '2.50 ABD $ ve 2,50 € gibi, farklı bölgeler için ondalık seperatör düzeltmek Avrupa için. – zero3nna

+0

@ Zero3nna ABD'de numaranın önüne koyduğunuzda, bu bizi çok garip görünen arkasına koyar. –

2

İşte bir extension kullanarak yukarıdaki cevabın Swift sürümü: Burada

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 
    } 
} 
1

Swift 3 çözümdür.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 
    } 
} 
0
  • İşleri Swift ve Objective-C içinde
  • Kuvvet Unwrapping asla arkadaşın.)

    kamu uzantısı @objc {

    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) 
    } 
    

    }

SKProduct, aynı [] gerekmez çünkü bilgisayarlı özelliklerini kullanma

  • Objective-C senaryo için temizleyici kod oluşturur NOT: import StoreKit

  • İlgili konular