Есть ли простой способ форматирования валюты в строку в iOS?
Мне нужен способ отформатировать цену из NSNumber в строку вроде этого:
"USD 0,99", а не "0,99 доллара США".
В моей игре используются пользовательские шрифты, и они не могут иметь символы для всех доступных валют App Store, таких как GBP. Поэтому я считаю, что лучше вернуться к строковому представлению валюты.
Используемый метод должен быть абсолютно нормальным для любой валюты, поддерживаемой App Store.
Ответы
Ответ 1
Если вы хотите, чтобы он был локализован (т.е. валюта на правильной стороне цены), это немного хлопот.
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]!
Ответ 2
Метод – productsRequest:didReceiveResponse:
возвращает вам список SKProducts.
Каждый продукт содержит свойство priceLocale
, которое содержит локальную валюту продукта для текущего пользователя.
Вы можете использовать следующий пример кода (apple), чтобы отформатировать его:
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numberFormatter setLocale:product.priceLocale];
NSString *formattedString = [numberFormatter stringFromNumber:product.price];
Удачи!
Ответ 3
Пример 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
Ответ 4
Хороший пример, который я нашел здесь 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)!
}
}
Ответ 5
используйте форматер таким образом или вы также можете настроить его
NSNumberFormatter *numberFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[numberFormatter setNumberStyle: NSNumberFormatterCurrencyStyle];
или как это
[formatter setFormat:@"USD ###.00"];
Я думаю, вы можете проверить валюту для страны и сохранить ее в строке и передать ее форматору.
Ответ 6
Самый простой способ добиться этого - использовать класс NSNumberFormatter для форматирования значения NSNumber по мере необходимости.
Несмотря на то, что методы слишком многочисленны, это дает широкий спектр возможностей форматирования вывода, включая метод setInternationalCurrencySymbol:
, который должен представлять особый интерес.
Ответ 7
Цена 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