我正在使用StoreKit
在我的应用程序中实现应用程序内购买商店。
我有自定义设计,这意味着价格的价值应该是白色和大的,货币符号更小,更暗,并且与价格值的顶部对齐。
使用NSLocale
的{{1}}属性中的SKproduct
以及priceLocale
属性中的价格值,我可以毫无问题地获取货币符号。
我的问题是知道何时应该在价格之前加上货币符号以及何时将货币符号放在价格之后。
示例:
我可以轻松地使用price
来“开箱即用”,但由于我的布局为价值和货币符号定义了不同的风格,我发现自己处于一个位置需要更多手动解决方法。
有什么想法吗?
答案 0 :(得分:19)
您拥有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]);
}
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)")
}
答案 1 :(得分:7)
语言环境对象似乎没有直接提供此信息,但数字格式化程序当然必须知道它。您不应该直接为他们的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");
答案 2 :(得分: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
,其中包含负数格式。确保解析该字符串。
答案 3 :(得分: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];
答案 4 :(得分:0)
我已经创建了SKProduct的扩展,将它们归属于imho。
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中的建议。
答案 5 :(得分:0)
Swift 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()