Swift IAP SKProduct显示了错误的价格

时间:2018-10-10 10:10:22

标签: ios swift nsnumberformatter currency-formatting skproduct

我在iOS应用中使用In App Purchases。我想根据用户/设备以正确的格式显示价格。

这是我的代码:

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.priceLocaleen_FR@currency=EUR (fixed)

Locale.currenten_FR (current)

输出:€20,99

应显示:20,99€

来自模拟器:

product.priceLocaleen_FR@currency=EUR (fixed)

Locale.currenten_US (current)

输出:20.99美元

应显示:20,99€或19.99美元


我有几个与其他货币有相同问题的用户,应该在价格后放置符号,这与美元格式不同。另一个用户看到的是 $ 7290而不是7290₸(价格相差很大……)。

我很确定这与语言设置Locale.current有关。但是,如果我在设备上将主要语言更改为法语,则价格为“€20,99”。奇怪的是我的Locale.current切换到en_US (current)

有什么办法解决这个问题?

我很满意的另一种解决方案:以美元显示所有人的价格,无论用户使用哪种语言和币种。

2 个答案:

答案 0 :(得分:1)

区域设置是正确输出的关键。 en_FR读起来像英语和法语区域。这将导致英语讲者的格式化输出,法语价格为->€10.00

使用模拟器并将地区和语言设置为法语,并使用Locale.current。它应该读取fr_FR并给出正确的输出。 10,00€

您是否尝试在模拟器上更改语言和区域,这会影响priceLocale吗?

答案 1 :(得分:0)

尝试一下

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