40

我正在为 iPhone 应用程序进行应用内购买。

我想在 UILabel 中以用户当地货币显示价格。为此,我需要变量中的价格和货币。

如何使用 SKPayment 获得包括货币在内的价格?(如果 SKPayment 对此用途是正确的。)

我正在使用以下方法实例化产品:

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

提前感谢大家的反馈!

4

5 回答 5

120

仅使用 NSLocaleCurrencySymbol + price.stringValue 存在问题:它不能处理不同语言环境的特殊性,例如。他们是否将货币符号放在前面。挪威、丹麦、瑞典和瑞士都将他们的货币放在后面,例如。17.00 克朗 此外,大多数(?)欧洲国家使用“,”而不是“。” 对于小数,例如。“2,99 欧元”而不是“2.99 欧元”。

一个更好的计划是使用 NSNumberFormatter。正如 Ed 演示的那样,SKProduct 返回的“priceLocale”是关键。它为 NSNumberFormatter 提供了正确格式化价格的智慧。

您还可以通过使用 Objective-C 类别向 SKProduct 添加新属性来简化此操作。将以下两个文件添加到您的项目中:


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

确定任何这些信息的正确方法是使用一个对象,该对象是在调用on a initialized后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 版本extension

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-08-29T14:21:28.210 回答
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 回答
0
  • 适用于SwiftObjective-C
  • 强制解包永远不是你的朋友。
  • 使用计算属性可以为 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

于 2018-02-15T16:11:48.357 回答