Swift IAP SKПродукт отображается неверная цена - PullRequest
0 голосов
/ 10 октября 2018

Я использую In App Покупки в приложении 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 49 (это совсем другая цена ...).

Я почти уверен, что это связано с настройкой языка или Locale.current.Но если я изменю свой основной язык на французский на моем устройстве, у меня будет та же цена "€ 20,99".Что странно, если мои Locale.current переключаются на en_US (current).

Любой способ решить эту проблему?

Другое решение, которое меня порадовало бы: отображать цену в долларах завсе , независимо от языка и валюты пользователя.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Настройка языка является ключом к правильному выводу.en_FR читает как английский язык и французский регион.Это приведет к форматированному выводу для говорящего на английском языке с французской ценой -> € 10,00

Используйте симулятор и задайте регион и язык для французского и используйте Locale.current.Он должен прочитать fr_FR и дать правильный вывод.10,00 €

Вы пытались изменить язык и регион на симуляторе и влияет ли это на priceLocale?

0 голосов
/ 10 октября 2018

Попробуйте это

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

...