Swift IAP SK产品显示的价格错误
Posted
技术标签:
【中文标题】Swift IAP SK产品显示的价格错误【英文标题】:Swift IAP SKProduct wrong price displayed 【发布时间】:2018-10-10 10:10:22 【问题描述】:我在 ios 应用中使用应用内购买。我想根据用户/设备以正确的格式显示价格。
这是我的代码:
let price=product.price
let numberFormatter = NumberFormatter()
numberFoxrmatter.formatterBehavior = .behavior10_4 //doesn't change anything if I remove this line
numberFormatter.numberStyle = .currency
numberFormatter.locale = product.priceLocale
let formattedPrice=numberFormatter.string(from: price)
但在某些情况下,货币符号并不好和/或放错了位置。 在我的示例中,价格产品是 $19.99 或 20,99€。
例子
来自设备:
product.priceLocale
:en_FR@currency=EUR (fixed)
Locale.current
:en_FR (current)
产出:20,99 欧元
应该显示:20,99€
来自模拟器:
product.priceLocale
:en_FR@currency=EUR (fixed)
Locale.current
:en_US (current)
产出:20.99 美元
应显示:20,99 欧元或 19.99 美元
我有几个用户对其他货币有同样的问题,与美元格式不同,符号应该放在价格之后。另一个用户看到的是 $7290 而不是 7290₸(这是完全不同的价格......)。
我很确定这与 语言设置 或 Locale.current
有关。但是,如果我在设备上将我的主要语言更改为法语,我将获得相同的价格“20,99 欧元”。奇怪的是我的Locale.current
切换到en_US (current)
。
有什么办法解决吗?
另一个我很满意的解决方案:以美元显示每个人的价格,无论用户的语言和货币如何。
【问题讨论】:
商品的价格(例如价值)基于您在 iTunes 中登录的国家/地区,而不是地区。因此,如果您使用美国帐户在 iTunes(沙盒?)中设置,您将看到美国值 我认为最好的选择是显示priceLocale.currencySymbol
。该符号在某些情况下会放错位置,但至少它是具有良好货币的良好价格。
【参考方案1】:
试试这个
let currencyFormatter = NumberFormatter()
currencyFormatter.usesGroupingSeparator = true
currencyFormatter.numberStyle = .currency
// localize to your grouping and decimal separator
currencyFormatter.locale = Locale.current
// We'll force unwrap with the !, if you've got defined data you may need more error checking
let priceString = currencyFormatter.string(from: 9999.99)!
print(priceString) // Displays $9,999.99 in the US locale
例子
currencyFormatter.locale = Locale(identifier: "fr_FR")
if let priceString = currencyFormatter.string(from: 9999.99)
print(priceString) // Displays 9 999,99 € in the French locale
更多详情请查看https://supereasyapps.com/blog/2016/2/8/how-to-use-nsnumberformatter-in-swift-to-make-currency-numbers-easy-to-read
【讨论】:
它没有用。而且我认为在某些时候应该考虑priceLocale
以避免错误?【参考方案2】:
区域设置是正确输出的关键。 en_FR 读起来像英语和法语地区。这将导致以法语价格为英语使用者的格式化输出 -> 10.00 欧元
使用模拟器并将区域和语言设置为法语并使用 Locale.current。它应该读取 fr_FR 并给出正确的输出。 10,00 欧元
您是否尝试在模拟器上更改语言和区域,这是否会影响 priceLocale?
【讨论】:
我在模拟器上将区域和语言设置为法语; priceLocale 转到fr_FR@currency=EUR (fixed)
,我得到 20,99 欧元。问题是我不能要求我的用户更改他们的设置,所以我需要找到一个适合所有人的解决方案。从@KerrM 的评论中,我想我会从 priceLocale 显示货币,仅此而已。
为什么要求用户更改首选设置?我认为通过用户设置显示不同的价格格式是正确的。使用 priceLocale 将为您做正确的事情。
我同意凯的观点。这应该不是问题 - 您在评论中描述的内容看起来像是预期的行为。
我以为@Kai 要求我更改设置(地区和语言)。以上是关于Swift IAP SK产品显示的价格错误的主要内容,如果未能解决你的问题,请参考以下文章