feature #26767 [Form] ability to set rounding strategy for MoneyType (syastrebov)

This PR was merged into the 4.1-dev branch.

Discussion
----------

[Form] ability to set rounding strategy for MoneyType

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | no
| License       | MIT
| Doc PR        | https://github.com/symfony/symfony-docs/pull/9543

Added `rounding_mode` to the `MoneyType` to be possible to change rounding strategy for money values. For now it's just `ROUND_HALF_UP` but it's good to have `ROUND_DOWN` as well. E.g. to transform `15.999` to `15.99` instead of `15.1`.

Commits
-------

f3b142420f rounding_mode for money type
This commit is contained in:
Fabien Potencier 2018-04-04 19:12:35 +02:00
commit fe6aa6414f
3 changed files with 30 additions and 1 deletions

View File

@ -5,6 +5,7 @@ CHANGELOG
-----
* added `input=datetime_immutable` to DateType, TimeType, DateTimeType
* added `rounding_mode` option to MoneyType
4.0.0
-----

View File

@ -12,6 +12,7 @@
namespace Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\DataTransformer\NumberToLocalizedStringTransformer;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\DataTransformer\MoneyToLocalizedStringTransformer;
@ -31,7 +32,7 @@ class MoneyType extends AbstractType
->addViewTransformer(new MoneyToLocalizedStringTransformer(
$options['scale'],
$options['grouping'],
null,
$options['rounding_mode'],
$options['divisor']
))
;
@ -53,11 +54,22 @@ class MoneyType extends AbstractType
$resolver->setDefaults(array(
'scale' => 2,
'grouping' => false,
'rounding_mode' => NumberToLocalizedStringTransformer::ROUND_HALF_UP,
'divisor' => 1,
'currency' => 'EUR',
'compound' => false,
));
$resolver->setAllowedValues('rounding_mode', array(
NumberToLocalizedStringTransformer::ROUND_FLOOR,
NumberToLocalizedStringTransformer::ROUND_DOWN,
NumberToLocalizedStringTransformer::ROUND_HALF_DOWN,
NumberToLocalizedStringTransformer::ROUND_HALF_EVEN,
NumberToLocalizedStringTransformer::ROUND_HALF_UP,
NumberToLocalizedStringTransformer::ROUND_UP,
NumberToLocalizedStringTransformer::ROUND_CEILING,
));
$resolver->setAllowedTypes('scale', 'int');
}

View File

@ -70,4 +70,20 @@ class MoneyTypeTest extends BaseTypeTest
$this->assertSame('{{ widget }}', $view->vars['money_pattern']);
}
public function testDefaultFormattingWithDefaultRounding()
{
$form = $this->factory->create(static::TESTED_TYPE, null, array('scale' => 0));
$form->setData('12345.54321');
$this->assertSame('12346', $form->createView()->vars['value']);
}
public function testDefaultFormattingWithSpecifiedRounding()
{
$form = $this->factory->create(static::TESTED_TYPE, null, array('scale' => 0, 'rounding_mode' => \NumberFormatter::ROUND_DOWN));
$form->setData('12345.54321');
$this->assertSame('12345', $form->createView()->vars['value']);
}
}