Я добавляю мультивалютную поддержку в приложение электронной коммерции. То, как я подошел к проблеме, заключалось в том, чтобы сохранить приложение в его базовой валюте и заставить шаблон вызывать функцию/плагин priceDisplay() каждый раз, когда он отображает цену. Таким образом, шаблон продолжает получать цены в долларовом выражении. Функция priceDisplay правильно конвертирует цену, если это необходимо, и добавляет правильный знак $ или евро в зависимости от настроек просмотра, сохраненных в сеансе. При отправке заказа приложение сохранит сумму заказа в долларах, а также валютный код и валютный курс. Кроме того, мы будем списывать средства с кредитной карты клиента в его валюте, чтобы гарантировать, что ему будет выставлен счет точно в том размере, который был показан на экране заказа.
Теперь проблема, с которой я сталкиваюсь, заключается в отображении итогов корзины в корзине, а также во время оформления заказа. В качестве примера приложение отправляет шаблону цены для отображения в корзине:
промежуточный итог: 9,75
корабль: 5,95
всего: 15,70
Шаблон берет эти суммы и вызывает функцию priceDisplay для каждого товара. Если курс валюты равен 1,1, то пользователю отображается:
промежуточный итог: 10.725 -> 10.73
корабль: 6.545 -> 6.55
всего: 17.27
Вы можете видеть, что промежуточный итог + корабль = 17,28, но общее преобразованное значение равно 17,27.
Итак, пара вариантов, которые, я думаю, могут сработать, хотя и не продуманы полностью:
- Обработка всех преобразований на стороне приложения
- Там, где товары будут суммироваться, шаблон должен отправить все отдельные сложения и общую сумму в базовой валюте в функцию priceDisplay, которая преобразует их и гарантирует, что преобразованная сумма и сумма слагаемых совпадают. В таком случае, как мне сообщить приложению, что сумма не 15,70, а, возможно, 15,71 или 15,69 (поскольку мы будем хранить заказ в базовой валюте и умножать на exchangeRate при обработке платежа).
- Следите за отброшенными/добавленными десятичными точками как часть преобразований и сделайте с этим что-нибудь «умное». Итак, в этом примере к 10,725 мы добавили 5 тысячных. Поэтому, когда мы конвертируем 6,545, мы должны сначала отбросить 0,005, а затем конвертировать. Возможно, это процесс, который делает вариант 2 выше?
- Ваше предложение здесь.
Если это имеет значение, приложение находится на PHP, а шаблон - Smarty.
Вы также можете увидеть ту же проблему при добавлении сумм строк в корзине:
3 товара x 9,75 каждый = 29,25
преобразовано:
3 товара x 10,73 (10,725) = 32,18 (32,175)
но 3 х 10,73 = 32,19 != 32,18