【问题标题】:Currency Conversion Algorithm Using Api使用 Api 的货币转换算法
【发布时间】:2018-05-11 00:05:38
【问题描述】:

我目前正在使用 PHP 开发一个应用程序,用户可以更改产品的货币货币,例如 ebay 或 aliexpress。因此,如果用户将其货币更改为美元,则所有产品价格都将转换为美元。

我搜索了一个 API 来获取名为 CurrencyLayer 的实时货币。 API 提供以下结构:

"success": true,
  "terms": "https://currencylayer.com/terms",
  "privacy": "https://currencylayer.com/privacy",
  "timestamp": 1432480209,
  "source": "USD",
  "quotes": {
    "USDAED": 3.67315,
    "USDAFN": 60.790001,
    "USDALL": 126.194504,
    "USDAMD": 477.359985,
    "USDANG": 1.790403,
    [...]
  }

我的计划是每小时将这些报价保存在我的数据库中。考虑转换货币的函数,将一种货币转换为另一种货币的正确算法是什么?我知道这并不难,但我想不通。

function convertCurrency($currency1 = 'USD', $currency2 = 'EUR', $value){
   //Search the currency value and algorithm to convert   
   $newValue = (????)
   return $newValue;
}

【问题讨论】:

标签: php algorithm currency


【解决方案1】:

请注意,由于结果看起来是 JSON 格式,您可能首先需要在结果上调用 json_decode 以获取 PHP 对象格式的结果。

json_decode 之后的 API 示例如下所示:

    // var_dump($api_result)
    stdClass Object
    (
        [success] => 1
        [terms] => https://currencylayer.com/terms
        [privacy] => https://currencylayer.com/privacy
        [timestamp] => 1432480209
        [source] => USD
        [quotes] => stdClass Object
            (
                [USDAED] => 3.67315
                [USDAFN] => 60.790001
                [USDALL] => 126.194504
                [USDAMD] => 477.359985
                [USDANG] => 1.790403
            )
    )

下一步是使用您的函数来组合这两个参数以访问(例如)USDAED 结果:

<?php

    function convertCurrency($currency1 = 'USD', $currency2 = 'EUR', $value) {
        //Search the currency value and algorithm to convert
        $combined_currencies = $currency1.$currency2;
        return $api_result->quotes->$combined_currencies * $value;
    }

    echo convertCurrency("USD", "AED", 1); // 3.67315

【讨论】:

  • 谢谢兄弟!但是,如果我想使用提供的信息(考虑到来源是美元)将例如 EUR 转换为 BRL?
  • @fabionvs 查看 REST API 文档。有一个标题“源货币切换”,其中显示您在发出请求时必须向 URL 请求“&source=EUR”。在这里检查一下,大约一半:currencylayer.com/documentation
【解决方案2】:

正如 Gary Thomas 已经提到的,CurrencyLayer API documentation 有一个 源货币切换 参数,允许您将基础货币从 USD 切换到您设置的任何 $currency1 参数到。

不过,据我了解,您希望能够定期查询 CurrencyLayer API,仅使用 USD 作为源货币,并自行执行汇率计算。

要实现这一点,你需要转换:

  1. CURRENCY 1USD
  2. USDCURRENCY 2

翻译成代码如下:

function convertCurrency($currency1, $currency2, $value)
{
    $baseCurrency = 'USD';

    $quotes = [
        'USDCAD' => 1.28024,
        'USDEUR' => 0.838313,
        // ...
    ];

    $quote1 = $quotes[$baseCurrency . $currency1];
    $quote2 = $quotes[$baseCurrency . $currency2];

    return $value / $quote1 * $quote2;
}

convertCurrency('EUR', 'CAD', 10); // 15.271622890257

您还可以使用 brick/money 等货币库来为您处理这些计算(以及更多):

use Brick\Math\RoundingMode;
use Brick\Money\CurrencyConverter;
use Brick\Money\ExchangeRateProvider\ConfigurableProvider;
use Brick\Money\ExchangeRateProvider\BaseCurrencyProvider;
use Brick\Money\Money;

$provider = new ConfigurableProvider();
$provider->setExchangeRate('USD', 'CAD', 1.28024);
$provider->setExchangeRate('USD', 'EUR', 0.838313);

// This is where the magic happens!
$provider = new BaseCurrencyProvider($provider, 'USD');

$converter = new CurrencyConverter($provider);

$money = Money::of(10, 'EUR');
$converter->convert($money, 'CAD', RoundingMode::DOWN); // CAD 15.27

BaseCurrencyProvider 就是为此目的而设计的,当您有一个相对于单一货币的汇率列表,并且想要在列表中的两种任意货币之间进行转换时。

请注意,在实际应用中,您可能会使用PDOProvider 直接从您的数据库中加载汇率,而不是上面使用的ConfigurableProvider

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    相关资源
    最近更新 更多