Number Format

Hello, my English is very bad. Sorry :)

I would like to form element input = 1.234,56 (thousands of marks = '.' and decimal point = ',') Save the input in the database in format = 1234.56 (decimal point = '.')

And Read from databse to form output = 1.234,56 (thousands of marks = '.' and decimal point = ',')

Thanks in advance Pet



975

Ok, i know that already.

How does it work with filters?

Pet

My example with volt:

Part of services.php:

/*
 * Read configuration
 */
$config = include __DIR__.'/config/config.php';

/*
 * Setting up the view component
 */
$di->set('view', function () use ($config) {
    $view = new View();
    $view->setViewsDir($config->module->loader->views);
    $view->registerEngines(array(
        '.volt' => function ($view, $di) use ($config) {
            $volt = new Volt($view, $di);
            $volt->setOptions(array(
                'compiledPath' => __DIR__.'/../../cache/',
                'compiledSeparator' => '_',
                'compileAlways' => true,
            ));
            $compiler = $volt->getCompiler();
            $compiler->addFunction('number_format', function ($resolvedArgs, $exprArgs) use ($compiler) {
                $firstArgument = $compiler->expression($exprArgs[0]['expr']);
                return 'number_format('.$firstArgument.", 2, '.', ' ')";
            });
            return $volt;
        },
        '.phtml' => 'Phalcon\Mvc\View\Engine\Php',
    ));
    return $view;
}, true);

Usage in volt:

{{ number_format(price) }}


6.2k

The question is actually very good and tricky to solve. One can use ',' as a decimal separator or '.' (especially when coming from the form input). So you can't use float filter if one uses ',' as a separator.

My best solution was to create a filter:

/**
 * Class Comma2Dot
 *
 * Converts decimals with dots or commas to correct float value without
 * thousand separator.
 * Correct float value = (float) [int].[decimals]
 *
 * @package App\Filter
 */
class Comma2Dot
{
    public function filter($value)
    {
        if(null == $value) {
            return null;
        }

        $dotPos   = strrpos($value, '.');
        $commaPos = strrpos($value, ',');
        $sep      = (($dotPos > $commaPos) && $dotPos)
            ? $dotPos
            : ((($commaPos > $dotPos) && $commaPos)
                ? $commaPos
                : false);

        if(!$sep) {
            return floatval(preg_replace("/[^0-9]/", "", $value));
        }

        return (float)
        preg_replace("/[^0-9]/", "", substr($value, 0, $sep)) .
        '.' .
        preg_replace("/[^0-9]/", "", substr($value, $sep + 1, strlen($value)));
    }
}

And then use this to filter form elements (type=number or type=text). You will get a number suitable for database input.



30.7k

Thanks for sharing: Piotr Woszczyk and mraspor



630

this code really works thank you

My example with volt:

Part of services.php:

```php /* * Read configuration */ $config = include DIR.'/config/config.php';

/* * Setting up the view component */ $di->set('view', function () use ($config) { $view = new View(); $view->setViewsDir($config->module->loader->views); $view->registerEngines(array( '.volt' => function ($view, $di) use ($config) { $volt = new Volt($view, $di); $volt->setOptions(array( 'compiledPath' => DIR.'/../../cache/', 'compiledSeparator' => '', 'compileAlways' => true, )); $compiler = $volt->getCompiler(); $compiler->addFunction('numberformat', function ($resolvedArgs, $exprArgs) use ($compiler) { $firstArgument = $compiler->expression($exprArgs[0]['expr']); return 'number_format('.$firstArgument.", 2, '.', ' ')"; }); return $volt; }, '.phtml' => 'Phalcon\Mvc\View\Engine\Php', )); return $view; }, true); ```

Usage in volt:

```volt {{ number_format(price) }} ```