You are here

function units_convert in Units of Measurement 7

Convert value measured in one unit into value measured in another unit.

Parameters

float $value: Value to be converted

string $from: Units in which $value is measured. Supply machine-readable name of the unit

string $to: Units in which $value needs to be converted. Supply machine-readable name of the unit

string $measure: Optional. Measure of value to be converted, normally the measure is looked up using the provided $form and $to, but in case the same unit measure is used in different measures, this parameter may narrow down unit measures to necessary scope of the supplied measure.

Return value

float Value $value, converted from $from units into $to units

1 call to units_convert()
UnitsWebTestCase::testConvert in ./units.test
Testing unit conversion correctness.

File

./units.module, line 117
Provide API for managing and converting units of measurement.

Code

function units_convert($value, $from, $to, $measure = NULL) {
  if ($from == $to) {

    // That's an easy one. Value converting from a unit into the same unit
    // always will be the same value.
    return $value;
  }
  $query = new EntityFieldQuery();
  $query
    ->entityCondition('entity_type', 'units_unit')
    ->propertyCondition('machine_name', array(
    $from,
    $to,
  ));
  if (!is_null($measure)) {
    $query
      ->entityCondition('bundle', $measure);
  }
  $result = $query
    ->execute();
  if (!isset($result['units_unit']) || count($result['units_unit']) != 2) {

    // Probably wrong $from and/or $to were supplied, otherwise we would have
    // got exactly 2 results.
    return FALSE;
  }

  // Loading entities.
  $entities = units_unit_load_multiple(array_keys($result['units_unit']));
  foreach ($entities as $entity) {
    switch ($entity->machine_name) {
      case $from:
        $from = $entity;
        break;
      case $to:
        $to = $entity;
        break;
    }
  }
  if ($from->measure != $to->measure) {

    // The found units are from different measures. That's not okay.
    return FALSE;
  }

  // Loading measure.
  $measure = units_measure_machine_name_load(field_extract_bundle('units_unit', $from));
  $plugin = units_get_converter($measure->converter);
  if (!$plugin) {
    return FALSE;
  }
  $function = ctools_plugin_get_function($plugin, 'convert callback');
  if (!$function) {
    return FALSE;
  }
  return $function($value, $from, $to);
}