TigerZF
🌐Español

25.9. Intercambio de divisas

En la sección anterior hablamos sobre los cálculos con divisas. Pero, como puede imaginar, calcular divisas a menudo implica calcular divisas diferentes de distintos países.

En este caso, las divisas deben intercambiarse para que ambas usen la misma divisa. En la vida real, esta información la proporcionan los bancos o la prensa diaria. Pero como estamos en la web, deberíamos usar los servicios de cambio disponibles. Zend_Currency permite su uso mediante un simple callback.

Primero, escribamos un servicio de cambio sencillo.

class SimpleExchange implements Zend_Currency_CurrencyInterface
{
    public function getRate($from, $to)
    {
        if ($from !== "USD") {
            throw new Exception('We can only exchange USD');
        }

        switch ($to) {
            case 'EUR':
                return 2;
            case 'JPE':
                return 0.7;
       }

       throw new Exception('Unable to exchange $to');
    }
}

Hemos creado ahora un servicio de cambio manual. No encajará en la vida real, pero muestra cómo funciona el intercambio de divisas.

Su clase de intercambio debe implementar la interfaz Zend_Currency_CurrencyInterface. Esta interfaz requiere que se implemente el único método getRate(). Este método recibe dos parámetros. Ambos son los nombres cortos de las divisas indicadas. Zend_Currency, por su parte, necesita que se devuelva la tasa de cambio.

En una clase de intercambio real, probablemente consultaría al proveedor del servicio para obtener las tasas de cambio correctas. Para nuestro ejemplo, la tasa manual será suficiente.

Ahora simplemente vincularemos nuestra clase de intercambio con Zend_Currency. Hay dos formas de hacerlo. Bien vinculando una instancia de la clase Exchange, o simplemente indicando una cadena con el nombre de la clase.

$currency = new Zend_Currency(
    array(
        'value'    => 1000,
        'currency' => 'EUR',
    )
);

$service  = new SimpleExchange();

// attach the exchange service
$currency->setService($service);

$currency2 = new Zend_Currency(
    array(
        'value'    => 1000,
        'currency' => 'USD',
    )
);

print $currency->add($currency2);

El ejemplo anterior devolverá '$ 3.000' porque los 1.000 USD serán convertidos con una tasa de 2 a 2.000 EUR.

[Note] Cálculo sin servicio de cambio

Cuando intente calcular dos objetos de divisa que no usen la misma divisa y no tengan ningún servicio de cambio vinculado, obtendrá una excepción. La razón es que Zend_Currency no puede entonces cambiar entre las distintas divisas.