You are here

function currency_api_convert in Currency 6

Same name and namespace in other branches
  1. 5 currency_api/currency_api.module \currency_api_convert()
  2. 7 currency_api/currency_api.module \currency_api_convert()

Currency exchange rate API function.

This function converts two currencies using exchange rates from Yahoo Finance. The currency codes are standard ISO 3-letter codes, and you can find the details here: http://www.oanda.com/site/help/iso_code.shtml

Here is an example on how to use it:

$from = 'CAD'; $to = 'USD'; $amt = 20; $ret = currency_api_convert($from, $to, $amt); if ($ret['status'] == FALSE) { drupal_set_message(t('An error occured: '). $ret['message']); } else { print $amt . ' ' . $from . ' = ' . $ret['value'] . ' ' . $to; }

Parameters

$currency_from: Currency to convert from.

$currency_to: Currency to convert to.

$amount: (optional) Amount to convert. Defaults to 1.

$decimals: (optional) Number of digits to the right of the decimal point. Leave out this parameter if you want the actual currency result to proceess it yourself. Defaults to NULL.

Return value

$result An associative array that contains the following: $result['status'] - TRUE or FALSE $result['message'] - 'success' when status is TRUE, otherwise, contains a descriptive error text The following items are only returned when status is TRUE $result['value'] - $amount * exchange rate of $currency_from into $currency_to $result['rate'] - Exchange rate of $currency_from into $currency_to $result['timestamp'] - Timestamp of the last update to the rates $result['date'] - Date of the last update to the rates (Format is "m/d/yyyy") $result['time'] - Time of the last update to the rates (Format is "h:mmpm")

3 calls to currency_api_convert()
currency_views_preload in views/currency.views.inc
Calls currency_api_convert for every exchange rate that should be displayed according to filter and argument settings to ensure that rates are in the database when views performs it's query.
theme_currency_result in ./currency.module
Theme implementation for currency exchange result.
_currency_api_filter_process in currency_api/currency_api.module
Processes values for the currency api filter.

File

currency_api/currency_api.module, line 114
This module provides an API for currency conversion.

Code

function currency_api_convert($currency_from, $currency_to, $amount = 1, $decimals = NULL) {
  $currency_array = array(
    's' => 'Currencies',
    'l1' => 'Last',
    'd1' => 'Date',
    't1' => 'Time',
  );
  $result = array();
  $result['status'] = FALSE;
  $result['message'] = NULL;
  $result['value'] = 0;
  $result['rate'] = 1.0;
  $result['timestamp'] = NULL;
  $result['date'] = NULL;
  $result['time'] = NULL;
  $from = drupal_strtoupper($currency_from);
  $to = drupal_strtoupper($currency_to);
  if ($from == $to) {
    return array(
      'status' => TRUE,
      'message' => 'success',
      'value' => $amount,
      'rate' => 1.0,
      'timestamp' => time(),
      'date' => date('n/j/Y'),
      'time' => date('g:ia'),
    );
  }

  // Load cached rate, if exists.
  $record = NULL;
  $cached = currency_api_load($record, $currency_from, $currency_to);
  if (!$record) {

    // Cached rate not found, go get it.
    $url = 'http://download.finance.yahoo.com/d/quotes.csv?e=.csv&f=' . currency_api_get_fields($currency_array) . '&s=' . $from . $to . '=X';

    // Validate the passed currency codes, to make sure they are valid.
    if (FALSE == currency_api_get_desc($from)) {
      $msg = t("currency: Invalid currency_from = %from", array(
        '%from' => $from,
      ));
      currency_log($msg, WATCHDOG_ERROR);
      $result['message'] = $msg;
      $result['status'] = FALSE;
    }
    if (FALSE == currency_api_get_desc($to)) {
      $msg = t("currency: Invalid currency_to = %to", array(
        '%to' => $to,
      ));
      currency_log($msg, WATCHDOG_ERROR);
      return FALSE;
      $result['message'] = $msg;
      $result['status'] = FALSE;
    }
    if (!is_numeric($amount)) {
      $msg = t("currency: Invalid amount = %amount", array(
        '%amount' => $amount,
      ));
      currency_log($msg, WATCHDOG_ERROR);
      $result['message'] = $msg;
      $result['status'] = FALSE;
    }
    $http_result = drupal_http_request($url);
    if (isset($http_result->error)) {
      $msg = t('currency: drupal_http_request error: @error', array(
        '@error' => $http_result->error,
      ));
      currency_log($msg, WATCHDOG_ERROR);
      return FALSE;
    }
    if ($http_result->code != 200) {
      $msg = t('currency: drupal_http_request code: @code', array(
        '@code' => $http_result->code,
      ));
      currency_log($msg, WATCHDOG_ERROR);
      return FALSE;
    }
    $record = $http_result->data;
  }
  if (!$record) {
    $msg = t('currency: cannot contact Yahoo Finance host');
    currency_log($msg, WATCHDOG_ERROR);
    $result['status'] = FALSE;
    $result['message'] = $msg;
  }
  else {
    $currency_data = explode(',', $record);
    $rate = $currency_data[1];
    $date = $currency_data[2];
    $time = $currency_data[3];
    $timestamp = strtotime(str_replace('"', '', $date) . ' ' . str_replace('"', '', $time));

    // Calculate the result.
    $value = $amount * $rate;

    // Format the result if $decimals value was specified.
    if ($decimals) {
      if (module_exists('format_number')) {
        $value = format_number($value, $decimals);
      }
      else {
        $value = number_format($value, $decimals);
      }
    }

    // Log it.
    $msg = t("currency: @amount @from = @value @to", array(
      '@amount' => $amount,
      '@from' => $from,
      '@value' => $value,
      '@to' => $to,
    ));
    currency_log($msg, WATCHDOG_NOTICE);

    // Got what we need.
    $result['value'] = $value;
    $result['rate'] = $rate;
    $result['timestamp'] = $timestamp;
    $result['date'] = $date;
    $result['time'] = $time;
    $result['status'] = TRUE;
    $result['message'] = 'success';
    if (!$cached) {

      // Cache rate does not exist, save it.
      currency_api_save($currency_from, $currency_to, $rate);
    }
  }
  return $result;
}