13

我正在使用StoreKit在我的应用程序中实现应用内购买商店。

我有一个定制设计,这意味着价格的价值应该是白色的和大的,货币符号更小、更暗并与价格价值的顶部对齐。

NSLocale通过使用inSKproductpriceLocale属性和属性中的价格值,我可以毫无问题地获取货币符号price

我的问题是知道何时应该将货币符号放在价格之前以及何时将其放在价格之后。

例子:

  • 5,99 美元
  • 0,79€</li>

我可以很容易地使用NSNumberFormatter“开箱即用”来解决这个问题,但是由于我的布局为价值和货币符号定义了不同的样式,我发现自己处于需要更多手动解决方法的位置。

有什么想法吗 ?

4

6 回答 6

21

您拥有SKProduct实例中所需的一切。只需NSNumberFormatter结合使用即可。

NSNumberFormatter *priceFormatter = [[NSNumberFormatter alloc] init];
[priceFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];        

for (SKProduct *product in response.products) {
    [priceFormatter setLocale:product.priceLocale];
    NSLog(@"Price for %@ is: %@",product.localizedTitle,[priceFormatter stringFromNumber:product.price]);
}

斯威夫特 3+

let priceFormatter = NumberFormatter()
priceFormatter.numberStyle = .currency

for product in response.products {
    priceFormatter.locale = product.priceLocale
    let localizedPrice = priceFormatter.string(from: product.price)
    print("Price for \(product.localizedTitle) is: \(localizedPrice)")
}
于 2013-04-30T21:31:14.487 回答
9

locale 对象似乎没有直接提供此信息,但数字格式化程序当然必须知道它。您不应该直接询问(新型)数字格式化程序format,尽管这可能会起作用,然后您可以¤在格式字符串中查找货币符号 , 。

可能更好的是创建一个CFNumberFormatter,它确实允许您查看其格式,然后检查该字符串:

// NSLocale and CFLocale are toll-free bridged, so if you have an existing
// NSNumberFormatter, you can get its locale and use that instead.
CFLocaleRef usLocale = CFLocaleCreate(NULL, CFSTR("en_US"));
CFNumberFormatterRef usFormatter = CFNumberFormatterCreate(NULL, usLocale, kCFNumberFormatterCurrencyStyle);
CFLocaleRef frLocale = CFLocaleCreate(NULL, CFSTR("fr_FR"));
CFNumberFormatterRef frFormatter = CFNumberFormatterCreate(NULL, frLocale, kCFNumberFormatterCurrencyStyle);

NSString * usString = (__bridge NSString *)CFNumberFormatterGetFormat(usFormatter);
NSString * frString = (__bridge NSString *)CFNumberFormatterGetFormat(frFormatter);

NSUInteger loc = ([usString rangeOfString:@"¤"]).location;
NSLog(@"Currency marker at beginning for US? %@", (loc == 0) ? @"YES" : @"NO");
loc = ([frString rangeOfString:@"¤"]).location;
NSLog(@"Currency marker at end for FR? %@", (loc == [frString length] - 1) ? @"YES" : @"NO");
于 2012-09-03T21:45:49.273 回答
2

我使用这个解决方案(Swift):

let currencyFormat = CFNumberFormatterGetFormat(CFNumberFormatterCreate(nil, locale, .CurrencyStyle)) as NSString
let positiveNumberFormat = currencyFormat.componentsSeparatedByString(";")[0] as NSString
let currencySymbolLocation = positiveNumberFormat.rangeOfString("¤").location
return (currencySymbolLocation == 0) ? .Before : .After

接受的答案应该是固定的,因为CFNumberFormatterGetFormat有时(对于某些语言环境)返回双精度值:¤##,#00.0;-¤##,#00.0其中包括负数格式。确保解析该字符串。

于 2016-04-26T17:20:15.343 回答
0

我的解决方案是设置小数样式并设置有效数字的最小数量。

static NSNumberFormatter *NumberFormatter;

if (!NumberFormatter) {
    NumberFormatter = [[NSNumberFormatter alloc] init];
    [NumberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
    [NumberFormatter setUsesSignificantDigits:YES];
    [NumberFormatter setMinimumSignificantDigits:2];
}

NSString *formattedNumberString = [NumberFormatter stringFromNumber:@(valueInEuro)];

NSString *stringInEuro = [NSString stringWithFormat:@"€ %@", formattedNumberString];
于 2013-09-24T12:49:02.963 回答
0

我创建了 SKProduct 的扩展,把东西放在它们所属的地方。

extension SKProduct
{
    var localizedPrice: String {
        let numberFormatter = NSNumberFormatter()
        numberFormatter.numberStyle = .CurrencyStyle
        numberFormatter.locale = self.priceLocale
        numberFormatter.formatterBehavior = .Behavior10_4
        return numberFormatter.stringFromNumber(self.price)!
    }
}

顺便说一句,这种格式化方式也正是 Apple 在In-App Purchase Programming Guide部分Retrieving Product Information中建议的内容。

于 2016-07-22T07:57:00.977 回答
0

斯威夫特 3

上的扩展功能Locale

extension Locale {
    func IsCurrenySymbolAtStart() -> Bool {
        let currencyFormatter = NumberFormatter()
        currencyFormatter.numberStyle = .currency
        currencyFormatter.locale = self

        let positiveFormat = currencyFormatter.positiveFormat as NSString
        let currencySymbolLocation = positiveFormat.range(of: "¤").location

        return (currencySymbolLocation == 0)
    }
}

用法:

let displayCurrencySymbolAtStart = NSLocale.current.IsCurrenySymbolAtStart()
于 2017-09-11T12:06:02.533 回答