有没有一种简单的方法可以在iOS中将货币格式化为字符串?

时间:2011-02-24 13:22:50

标签: iphone objective-c ios app-store currency

我需要一种方法将NSNumber的价格格式化为这样的字符串: “0.99美元”,而非“0.99美元”。

我的游戏使用自定义字体,并且他们无法使用所有可用的App Store货币(如GBP)的符号。所以我认为回滚到货币的字符串表示更好。

对于App Store支持的任何货币,使用的方法应该绝对正常。

7 个答案:

答案 0 :(得分:36)

如果你想让它本地化(即货币在价格的正确一边),这有点麻烦。

NSDecimalNumber *price = [NSDecimalNumber decimalNumberWithString:@"1.99"];
NSLocale *priceLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"de_DE"] autorelease]; // get the locale from your SKProduct

NSNumberFormatter *currencyFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[currencyFormatter setLocale:priceLocale];
NSString *currencyString = [currencyFormatter internationalCurrencySymbol]; // EUR, GBP, USD...
NSString *format = [currencyFormatter positiveFormat];
format = [format stringByReplacingOccurrencesOfString:@"¤" withString:currencyString];
    // ¤ is a placeholder for the currency symbol
[currencyFormatter setPositiveFormat:format];

NSString *formattedCurrency = [currencyFormatter stringFromNumber:price];

使用您从SKProduct获得的区域设置。不要使用[NSLocale currentLocale]!

答案 1 :(得分:8)

– productsRequest:didReceiveResponse:方法会为您提供SKProducts

的列表

每个产品都包含一个属性priceLocale,其中包含当前用户的产品的本地货币。

您可以使用以下示例代码(apple's)对其进行格式化:

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numberFormatter setLocale:product.priceLocale];
NSString *formattedString = [numberFormatter stringFromNumber:product.price];
祝你好运!

答案 2 :(得分:4)

Swift示例:

var currencyFormatter = NSNumberFormatter()
currencyFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
currencyFormatter.locale = priceLocale //SKProduct->priceLocale
var currencyString = currencyFormatter.internationalCurrencySymbol
var format = currencyFormatter.positiveFormat
format = format.stringByReplacingOccurrencesOfString("¤", withString: currencyString)
currencyFormatter.positiveFormat = format

var formattedCurrency = currencyFormatter.stringFromNumber(price) //SKProduct->price

println("formattedCurrency: \(formattedCurrency)")//formattedCurrency: 0,89 EUR

答案 3 :(得分:3)

我在这里找到了很好的例子http://bendodson.com/weblog/2014/12/10/skproduct-localized-price-in-swift/

import StoreKit

extension SKProduct {

    @objc func localizedPrice() -> String {
        let formatter = NSNumberFormatter()
        formatter.numberStyle = .CurrencyStyle
        formatter.locale = self.priceLocale
        return formatter.stringFromNumber(self.price)!
    }
}

答案 4 :(得分:2)

以这种方式使用格式化程序,或者您也可以自定义

NSNumberFormatter *numberFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[numberFormatter setNumberStyle: NSNumberFormatterCurrencyStyle];

或者像这样

[formatter setFormat:@"USD ###.00"];

我认为您可以检查国家/地区的货币并将其存储在字符串中并将其提供给格式化程序。

答案 5 :(得分:1)

实现此目的的最简单方法是使用NSNumberFormatter类根据需要格式化NSNumber值。

虽然方法太多而无法提及,但这提供了各种各样的输出格式化功能,包括应该特别感兴趣的setInternationalCurrencySymbol:方法。

答案 6 :(得分:0)

SKProduct价格是NSDecimalNumber对象,因此您可以这样做的一种方法是扩展NSDecimalNumber类。这是我的Swift代码:

extension NSDecimalNumber {
    func asCurrency(locale:NSLocale) -> String? {
        var numberFormatter = NSNumberFormatter()
        numberFormatter.formatterBehavior = NSNumberFormatterBehavior.Behavior10_4
        numberFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
        numberFormatter.locale = locale
        return numberFormatter.stringFromNumber(self)
    }
}
Objective-C中的

看起来像这样:

@interface NSDecimalNumber (CurrencyExtension)

- (NSString*) asCurrency: (NSLocale *)locale;

@end

@implementation NSDecimalNumber (DellExtensions)

- (NSString*) asCurrency: (NSLocale *)locale {
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
    [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    [numberFormatter setLocale:product.priceLocale];
    return [numberFormatter stringFromNumber:product.price];
}

@end