Есть простой способ отформатировать валюту в строку в iOS? - PullRequest
14 голосов
/ 24 февраля 2011

Мне нужен способ отформатировать цену из NSNumber в строку вроде этой: «0,99 долларов США», а не «0,99 долларов США».

В моей игре используются пользовательские шрифты, и они не могут содержать символывсе доступные валюты App Store, такие как GBP.Поэтому я думаю, что лучше вернуться к строковому представлению валюты.

Используемый метод должен быть абсолютно приемлемым для любой валюты, поддерживаемой App Store.

Ответы [ 7 ]

36 голосов
/ 24 февраля 2011

Если вы хотите, чтобы он был локализован (т.е. валюта на правильной стороне цены), это немного хлопотно.

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]!

8 голосов
/ 28 февраля 2012

Метод – 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];

Удачи!

4 голосов
/ 19 сентября 2014

Пример 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 голосов
/ 25 марта 2015

Хороший пример, который я нашел здесь 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)!
    }
}
2 голосов
/ 24 февраля 2011

используйте форматер таким образом, или вы также можете настроить его

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

или как это

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

Я думаю, что вы можете проверить валюту страны, сохранить ее в строке и передать ее форматеру.

1 голос
/ 24 февраля 2011

Самый простой способ добиться этого - использовать класс NSNumberFormatter для форматирования значения NSNumber по мере необходимости.

Хотя методов слишком много, чтобы упоминать, это обеспечивает широкий спектр возможностей форматирования вывода, включая метод setInternationalCurrencySymbol:, который должен представлять особый интерес.

0 голосов
/ 16 марта 2015

Цена 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
...