Jump to content

Formatos de los números (Cerrado)


Recommended Posts

Ya es la segunda vez que compruebo que Prestashop (mi versión es 1.7.8.8) trata correctamente los valores numéricos correspondientes a monedas pero no el resto. Por ejemplo, en una factura, el la tabla de desglose de impuestos pone un punto como separador decimal, en lugar de una coma con lo que un 21% de IVA se convierte en un 21.000% Otro ejemplo: En la vista de detalle de un pedido (front), en la tabla de transporte, campo "peso" resulta que un paquete de 20 kg se muestra de 20.000 kg.

El problema es que estos números llegan a la plantilla ya formateados en formato cadena de texto y con las unidades añadidas, por lo que no se puede emplear nada sencillo para formatearlos correctamente en la plantilla. En el campo del peso explicado anteriormente he tenido que hacer cambios en el código de Prestashop (fichero src/Adapter/Presenter/Order/OrderDetailLazyArray.php)

                $orderShipping[$shippingId]['shipping_weight'] =
                    ($shipping['weight'] > 0) ? sprintf('%d', ceil($shipping['weight'])) . ' ' . // MANOLO: cambiamos el formato %.3f (float)  y ponemos %d redondeado al alza para evitar error de formato 20.000 Kg
                        Configuration::get('PS_WEIGHT_UNIT') : '-';

Pero claro, no quiero tocar en el core de Prestashop y perder todos los cambios con cada actualización. ¿Hay alguna forma de obtener el número correctamente formateado dependiendo de la localización? ¿Se podría hacer algo en las plantillas? 

Edited by Manuel_GT (see edit history)
Link to comment
Share on other sites

Después de investigar un poco, he descubierto esto (mi software es 1.7.8.8).

La plantilla utiliza unas funciones para mostrar los precios de la factura definidas en el fichero "classes/pdf/PDF.php"

       /* For PDF we restore some functions from Smarty
         * they've been removed in PrestaShop 1.7 so
         * new themes don't use them. Although PDF haven't been
         * reworked so every PDF controller must extend this class.
         */
        smartyRegisterFunction($this->smarty, 'function', 'convertPrice', ['Product', 'convertPrice'], true, $original_lazy_register);
        smartyRegisterFunction($this->smarty, 'function', 'convertPriceWithCurrency', ['Product', 'convertPriceWithCurrency'], true, $original_lazy_register);
        smartyRegisterFunction($this->smarty, 'function', 'displayWtPrice', ['Product', 'displayWtPrice'], true, $original_lazy_register);
        smartyRegisterFunction($this->smarty, 'function', 'displayWtPriceWithCurrency', ['Product', 'displayWtPriceWithCurrency'], true, $original_lazy_register);
        smartyRegisterFunction($this->smarty, 'function', 'displayPrice', ['Tools', 'displayPriceSmarty'], true, $original_lazy_register);

En la plantilla se usan así

              <td class="right white">
                {if isset($is_order_slip) && $is_order_slip}- {/if}
                {displayPrice currency=$order->id_currency price=$line.total_tax_excl}
              </td>

Por tanto he probado a crear una nueva función siguiendo el formato para los números que no son precios:

        // MANOLO:  función añadida para mostrar el número de la factura i18n correcto
        smartyRegisterFunction($this->smarty, 'function', 'displayNumber', ['Tools', 'displayNumber'], true, $original_lazy_register);

y he alterado la plantilla para que la use en el valor que quiero formatear

 

            <td class="center white">
              {displayNumber number=$line.rate} %
            </td>

Pero no funciona. Al parecer el parámetro que la función formatNumber de Tools.php recibe es un array de un elemento:  $number = ['number' => '10.00'] en lugar del número y esto provoca un error de tipo "Notice: Array to string conversion" en src/Core/Localization/Number/Formatter.php

Así que en lugar de llamar a la función de Tools::displayNumber, he creado mi propia funcion Tools:displayNumberPdf

    /**
     * MANOLO: función para mostrar los números con el i18n correcto en los PDF
     * @param $params
     * @param $smarty
     * @return string
     * @throws LocalizationException
     */
    public static function displayNumberPdf($params, &$smarty)
    {
        $context = Context::getContext();
        $locale = static::getContextLocale($context);

        return $locale->formatNumber($params['number']);
    }

y la defino con el resto en classes/pdf/PDF.php:

        // MANOLO:  función añadida para mostrar el número de la factura i18n correcto
        smartyRegisterFunction($this->smarty, 'function', 'displayNumber', ['Tools', 'displayNumberPdf'], true, $original_lazy_register);

Funciona perfectamente, aunque ahora no me salen decimales y no se si cuando los haya, serán con un "." o una "," 😞

No me gusta nada tocar el core de Prestashop pero creo que en este caso es inevitable. ¿A alguien se le ocurre otra forma de hacerlo?

 

gracias.

 

Link to comment
Share on other sites

Definitivamente la solución funciona. He probado a sumar un numero con decimales antes de formatear y lo muestra correctamente. Además lo he podido aplicar también a la otra cifra que mencionaba. El peso del paquete. En este caso en src/Adapter/Presenter/Order/OrderDetailLazyArray.php  ahora pone:

                $orderShipping[$shippingId]['shipping_weight'] =
                    //($shipping['weight'] > 0) ? sprintf('%d', ceil($shipping['weight'])) . ' ' . // MANOLO: cambiamos el formato %.3f (float)  y ponemos %d redondeado al alza para evitar error 20.000 kg
                    ($shipping['weight'] > 0) ? $this->locale->formatNumber($shipping['weight']) . ' ' . // MANOLO: 2ª opción. Llamamos al Locale para formatear el numero en el i18n correcto. ;-)
                        Configuration::get('PS_WEIGHT_UNIT') : '-';

Cierro el hilo. Gracias.

Link to comment
Share on other sites

  • Manuel_GT changed the title to Formatos de los números (Cerrado)

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...