У меня есть приложение, в котором пользователи вводят данные о проживании, включая стоимость за ночь, а затем выбирают соответствующую валюту из выпадающего списка. Затем я использую fixer.io, чтобы показать стоимость как в валюте, в которой он был введен, так и в пересчете на валюту пользователя по умолчанию.
Стоимость сохраняется в базе данных как целое число. У меня есть методы convertToInteger
и convertFromInteger
, которые берут валюту, смотрят, сколько существует субъединиц и выполняют соответствующую математику.
Существует также метод formatCurrency
для форматирования в соответствии с валютой. И метод convertBetweenCurrency
для фактического преобразования.
Метод convertFromInteger
вызывается внутри метода formatCurrency
.
$cost_per_night_entered
работает нормально и отображает правильное количество и форматирование , Тем не менее, $cost_per_night_user
, по-видимому, дважды преобразуется из целого числа - оно всегда отсутствует этой единицей. Итак, 148 долларов отображаются как 1,48.
Я пытался использовать Laravel fresh()
и refresh()
безрезультатно. Связано ли это с «вложением» вызовов вместе? Я не думаю, что я сделал что-то глупое, например, дважды позвонил - но взгляды sh могут быть иначе:)
Контроллер show
метод:
$cost_per_night_entered = formatCurrency($accommodation->cost_per_night, $accommodation->currency, getLocale($accommodation->country));
$cost_per_night_user = formatCurrency(convertBetweenCurrency($accommodation->cost_per_night, $accommodation->currency, Auth::user()->currency), Auth::user()->currency, request()->server('HTTP_ACCEPT_LANGUAGE'));
Методы модели :
function formatCurrency($amount, $currency_code, $locale)
{
$value = intval(convertFromInteger($amount, $currency_code));
$money = new Money\Money($value, new Money\Currency($currency_code));
$currencies = new Money\Currencies\ISOCurrencies();
$numberFormatter = new \NumberFormatter($locale, \NumberFormatter::CURRENCY);
$moneyFormatter = new Money\Formatter\IntlMoneyFormatter($numberFormatter, $currencies);
return $moneyFormatter->format($money);
}
function convertBetweenCurrency($amount, $from_currency, $to_currency)
{
$endpoint = 'convert';
$access_key = 'xxx';
// initialize CURL:
$ch = curl_init('http://data.fixer.io/api/'.$endpoint.'? access_key='.$access_key.'&from='.$from_currency.'&to='.$to_currency.'&amount='.$amount.'');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// get the JSON data:
$json = curl_exec($ch);
curl_close($ch);
// Decode JSON response:
$conversionResult = json_decode($json, true);
// access the conversion result
return intval($conversionResult['result']);
}
function convertFromInteger($amount, $currency_code)
{
$currencies = PragmaRX\Countries\Package\Countries::currencies();
$currency = $currencies->where('iso.code', $currency_code)->toArray();
return $amount / (1 / $currency[$currency_code]['units']['minor']['majorValue']);
}