feature #13717 Deprecated precision option in favor of scale (WouterJ)

This PR was merged into the 2.7 branch.

Discussion
----------

Deprecated precision option in favor of scale

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

Scale is the number of digits to the right of the decimal point in a number, precision isn't. See the referenced ticket for more context.

Commits
-------

2a2f7e2 Deprecated precision option in favor of scale
This commit is contained in:
Fabien Potencier 2015-04-03 19:01:25 +02:00
commit 53fa5e375d
13 changed files with 116 additions and 38 deletions

View File

@ -106,6 +106,24 @@ UPGRADE FROM 2.x to 3.0
### Form ### Form
* The option "precision" was renamed to "scale".
Before:
```php
$builder->add('length', 'number', array(
'precision' => 3,
));
```
After:
```php
$builder->add('length', 'number', array(
'scale' => 3,
));
```
* The method `AbstractType::setDefaultOptions(OptionsResolverInterface $resolver)` and * The method `AbstractType::setDefaultOptions(OptionsResolverInterface $resolver)` and
`AbstractTypeExtension::setDefaultOptions(OptionsResolverInterface $resolver)` have been `AbstractTypeExtension::setDefaultOptions(OptionsResolverInterface $resolver)` have been
renamed. You should use `AbstractType::configureOptions(OptionsResolver $resolver)` and renamed. You should use `AbstractType::configureOptions(OptionsResolver $resolver)` and

View File

@ -4,6 +4,7 @@ CHANGELOG
2.7.0 2.7.0
----- -----
* deprecated option "precision" in favor of "scale"
* deprecated the overwriting of AbstractType::setDefaultOptions() in favor of overwriting AbstractType::configureOptions(). * deprecated the overwriting of AbstractType::setDefaultOptions() in favor of overwriting AbstractType::configureOptions().
* deprecated the overwriting of AbstractTypeExtension::setDefaultOptions() in favor of overwriting AbstractTypeExtension::configureOptions(). * deprecated the overwriting of AbstractTypeExtension::setDefaultOptions() in favor of overwriting AbstractTypeExtension::configureOptions().

View File

@ -22,11 +22,11 @@ class IntegerToLocalizedStringTransformer extends NumberToLocalizedStringTransfo
/** /**
* Constructs a transformer. * Constructs a transformer.
* *
* @param int $precision Unused. * @param int $scale Unused.
* @param bool $grouping Whether thousands should be grouped. * @param bool $grouping Whether thousands should be grouped.
* @param int $roundingMode One of the ROUND_ constants in this class. * @param int $roundingMode One of the ROUND_ constants in this class.
*/ */
public function __construct($precision = 0, $grouping = false, $roundingMode = self::ROUND_DOWN) public function __construct($scale = 0, $grouping = false, $roundingMode = self::ROUND_DOWN)
{ {
if (null === $roundingMode) { if (null === $roundingMode) {
$roundingMode = self::ROUND_DOWN; $roundingMode = self::ROUND_DOWN;

View File

@ -23,17 +23,17 @@ class MoneyToLocalizedStringTransformer extends NumberToLocalizedStringTransform
{ {
private $divisor; private $divisor;
public function __construct($precision = 2, $grouping = true, $roundingMode = self::ROUND_HALF_UP, $divisor = 1) public function __construct($scale = 2, $grouping = true, $roundingMode = self::ROUND_HALF_UP, $divisor = 1)
{ {
if (null === $grouping) { if (null === $grouping) {
$grouping = true; $grouping = true;
} }
if (null === $precision) { if (null === $scale) {
$precision = 2; $scale = 2;
} }
parent::__construct($precision, $grouping, $roundingMode); parent::__construct($scale, $grouping, $roundingMode);
if (null === $divisor) { if (null === $divisor) {
$divisor = 1; $divisor = 1;

View File

@ -93,13 +93,16 @@ class NumberToLocalizedStringTransformer implements DataTransformerInterface
*/ */
const ROUND_HALFDOWN = \NumberFormatter::ROUND_HALFDOWN; const ROUND_HALFDOWN = \NumberFormatter::ROUND_HALFDOWN;
/**
* @deprecated since version 2.7, will be replaced by a $scale private property in 3.0.
*/
protected $precision; protected $precision;
protected $grouping; protected $grouping;
protected $roundingMode; protected $roundingMode;
public function __construct($precision = null, $grouping = false, $roundingMode = self::ROUND_HALF_UP) public function __construct($scale = null, $grouping = false, $roundingMode = self::ROUND_HALF_UP)
{ {
if (null === $grouping) { if (null === $grouping) {
$grouping = false; $grouping = false;
@ -109,7 +112,7 @@ class NumberToLocalizedStringTransformer implements DataTransformerInterface
$roundingMode = self::ROUND_HALF_UP; $roundingMode = self::ROUND_HALF_UP;
} }
$this->precision = $precision; $this->precision = $scale;
$this->grouping = $grouping; $this->grouping = $grouping;
$this->roundingMode = $roundingMode; $this->roundingMode = $roundingMode;
} }
@ -240,7 +243,7 @@ class NumberToLocalizedStringTransformer implements DataTransformerInterface
} }
/** /**
* Rounds a number according to the configured precision and rounding mode. * Rounds a number according to the configured scale and rounding mode.
* *
* @param int|float $number A number. * @param int|float $number A number.
* *
@ -249,7 +252,7 @@ class NumberToLocalizedStringTransformer implements DataTransformerInterface
private function round($number) private function round($number)
{ {
if (null !== $this->precision && null !== $this->roundingMode) { if (null !== $this->precision && null !== $this->roundingMode) {
// shift number to maintain the correct precision during rounding // shift number to maintain the correct scale during rounding
$roundingCoef = pow(10, $this->precision); $roundingCoef = pow(10, $this->precision);
$number *= $roundingCoef; $number *= $roundingCoef;

View File

@ -33,22 +33,22 @@ class PercentToLocalizedStringTransformer implements DataTransformerInterface
private $type; private $type;
private $precision; private $scale;
/** /**
* Constructor. * Constructor.
* *
* @see self::$types for a list of supported types * @see self::$types for a list of supported types
* *
* @param int $precision The precision * @param int $scale The scale
* @param string $type One of the supported types * @param string $type One of the supported types
* *
* @throws UnexpectedTypeException if the given value of type is unknown * @throws UnexpectedTypeException if the given value of type is unknown
*/ */
public function __construct($precision = null, $type = null) public function __construct($scale = null, $type = null)
{ {
if (null === $precision) { if (null === $scale) {
$precision = 0; $scale = 0;
} }
if (null === $type) { if (null === $type) {
@ -60,7 +60,7 @@ class PercentToLocalizedStringTransformer implements DataTransformerInterface
} }
$this->type = $type; $this->type = $type;
$this->precision = $precision; $this->scale = $scale;
} }
/** /**
@ -142,7 +142,7 @@ class PercentToLocalizedStringTransformer implements DataTransformerInterface
{ {
$formatter = new \NumberFormatter(\Locale::getDefault(), \NumberFormatter::DECIMAL); $formatter = new \NumberFormatter(\Locale::getDefault(), \NumberFormatter::DECIMAL);
$formatter->setAttribute(\NumberFormatter::FRACTION_DIGITS, $this->precision); $formatter->setAttribute(\NumberFormatter::FRACTION_DIGITS, $this->scale);
return $formatter; return $formatter;
} }

View File

@ -14,6 +14,7 @@ namespace Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\DataTransformer\IntegerToLocalizedStringTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\IntegerToLocalizedStringTransformer;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
class IntegerType extends AbstractType class IntegerType extends AbstractType
@ -25,7 +26,7 @@ class IntegerType extends AbstractType
{ {
$builder->addViewTransformer( $builder->addViewTransformer(
new IntegerToLocalizedStringTransformer( new IntegerToLocalizedStringTransformer(
$options['precision'], $options['scale'],
$options['grouping'], $options['grouping'],
$options['rounding_mode'] $options['rounding_mode']
)); ));
@ -36,9 +37,19 @@ class IntegerType extends AbstractType
*/ */
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$scale = function (Options $options) {
if (null !== $options['precision']) {
trigger_error('The form option "precision" is deprecated since version 2.7 and will be removed in 3.0. Use "scale" instead.', E_USER_DEPRECATED);
}
return $options['precision'];
};
$resolver->setDefaults(array( $resolver->setDefaults(array(
// default precision is locale specific (usually around 3) // deprecated as of Symfony 2.7, to be removed in Symfony 3.0.
'precision' => null, 'precision' => null,
// default scale is locale specific (usually around 3)
'scale' => $scale,
'grouping' => false, 'grouping' => false,
// Integer cast rounds towards 0, so do the same when displaying fractions // Integer cast rounds towards 0, so do the same when displaying fractions
'rounding_mode' => IntegerToLocalizedStringTransformer::ROUND_DOWN, 'rounding_mode' => IntegerToLocalizedStringTransformer::ROUND_DOWN,
@ -54,6 +65,8 @@ class IntegerType extends AbstractType
IntegerToLocalizedStringTransformer::ROUND_UP, IntegerToLocalizedStringTransformer::ROUND_UP,
IntegerToLocalizedStringTransformer::ROUND_CEILING, IntegerToLocalizedStringTransformer::ROUND_CEILING,
)); ));
$resolver->setAllowedTypes('scale', array('null', 'int'));
} }
/** /**

View File

@ -16,6 +16,7 @@ use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\DataTransformer\MoneyToLocalizedStringTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\MoneyToLocalizedStringTransformer;
use Symfony\Component\Form\FormView; use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
class MoneyType extends AbstractType class MoneyType extends AbstractType
@ -29,7 +30,7 @@ class MoneyType extends AbstractType
{ {
$builder $builder
->addViewTransformer(new MoneyToLocalizedStringTransformer( ->addViewTransformer(new MoneyToLocalizedStringTransformer(
$options['precision'], $options['scale'],
$options['grouping'], $options['grouping'],
null, null,
$options['divisor'] $options['divisor']
@ -50,13 +51,27 @@ class MoneyType extends AbstractType
*/ */
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$scale = function (Options $options) {
if (null !== $options['precision']) {
trigger_error('The form option "precision" is deprecated since version 2.7 and will be removed in 3.0. Use "scale" instead.', E_USER_DEPRECATED);
return $options['precision'];
}
return 2;
};
$resolver->setDefaults(array( $resolver->setDefaults(array(
'precision' => 2, // deprecated as of Symfony 2.7, to be removed in Symfony 3.0
'precision' => null,
'scale' => $scale,
'grouping' => false, 'grouping' => false,
'divisor' => 1, 'divisor' => 1,
'currency' => 'EUR', 'currency' => 'EUR',
'compound' => false, 'compound' => false,
)); ));
$resolver->setAllowedTypes('scale', 'int');
} }
/** /**

View File

@ -14,6 +14,7 @@ namespace Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\DataTransformer\NumberToLocalizedStringTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\NumberToLocalizedStringTransformer;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
class NumberType extends AbstractType class NumberType extends AbstractType
@ -24,7 +25,7 @@ class NumberType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder->addViewTransformer(new NumberToLocalizedStringTransformer( $builder->addViewTransformer(new NumberToLocalizedStringTransformer(
$options['precision'], $options['scale'],
$options['grouping'], $options['grouping'],
$options['rounding_mode'] $options['rounding_mode']
)); ));
@ -35,9 +36,19 @@ class NumberType extends AbstractType
*/ */
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$scale = function (Options $options) {
if (null !== $options['precision']) {
trigger_error('The form option "precision" is deprecated since version 2.7 and will be removed in 3.0. Use "scale" instead.', E_USER_DEPRECATED);
}
return $options['precision'];
};
$resolver->setDefaults(array( $resolver->setDefaults(array(
// default precision is locale specific (usually around 3) // deprecated as of Symfony 2.7, to be removed in Symfony 3.0
'precision' => null, 'precision' => null,
// default scale is locale specific (usually around 3)
'scale' => $scale,
'grouping' => false, 'grouping' => false,
'rounding_mode' => NumberToLocalizedStringTransformer::ROUND_HALF_UP, 'rounding_mode' => NumberToLocalizedStringTransformer::ROUND_HALF_UP,
'compound' => false, 'compound' => false,
@ -52,6 +63,8 @@ class NumberType extends AbstractType
NumberToLocalizedStringTransformer::ROUND_UP, NumberToLocalizedStringTransformer::ROUND_UP,
NumberToLocalizedStringTransformer::ROUND_CEILING, NumberToLocalizedStringTransformer::ROUND_CEILING,
)); ));
$resolver->setAllowedTypes('scale', array('null', 'int'));
} }
/** /**

View File

@ -14,6 +14,7 @@ namespace Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
class PercentType extends AbstractType class PercentType extends AbstractType
@ -23,7 +24,7 @@ class PercentType extends AbstractType
*/ */
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder->addViewTransformer(new PercentToLocalizedStringTransformer($options['precision'], $options['type'])); $builder->addViewTransformer(new PercentToLocalizedStringTransformer($options['scale'], $options['type']));
} }
/** /**
@ -31,8 +32,20 @@ class PercentType extends AbstractType
*/ */
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
{ {
$scale = function (Options $options) {
if (null !== $options['precision']) {
trigger_error('The form option "precision" is deprecated since version 2.7 and will be removed in 3.0. Use "scale" instead.', E_USER_DEPRECATED);
return $options['precision'];
}
return 0;
};
$resolver->setDefaults(array( $resolver->setDefaults(array(
'precision' => 0, // deprecated as of Symfony 2.7, to be removed in Symfony 3.0.
'precision' => null,
'scale' => $scale,
'type' => 'fractional', 'type' => 'fractional',
'compound' => false, 'compound' => false,
)); ));
@ -41,6 +54,8 @@ class PercentType extends AbstractType
'fractional', 'fractional',
'integer', 'integer',
)); ));
$resolver->setAllowedTypes('scale', 'int');
} }
/** /**

View File

@ -74,7 +74,7 @@ class NumberToLocalizedStringTransformerTest extends \PHPUnit_Framework_TestCase
$this->assertSame($to, $transformer->transform($from)); $this->assertSame($to, $transformer->transform($from));
} }
public function testTransformWithPrecision() public function testTransformWithScale()
{ {
$transformer = new NumberToLocalizedStringTransformer(2); $transformer = new NumberToLocalizedStringTransformer(2);
@ -174,14 +174,14 @@ class NumberToLocalizedStringTransformerTest extends \PHPUnit_Framework_TestCase
/** /**
* @dataProvider transformWithRoundingProvider * @dataProvider transformWithRoundingProvider
*/ */
public function testTransformWithRounding($precision, $input, $output, $roundingMode) public function testTransformWithRounding($scale, $input, $output, $roundingMode)
{ {
$transformer = new NumberToLocalizedStringTransformer($precision, null, $roundingMode); $transformer = new NumberToLocalizedStringTransformer($scale, null, $roundingMode);
$this->assertEquals($output, $transformer->transform($input)); $this->assertEquals($output, $transformer->transform($input));
} }
public function testTransformDoesNotRoundIfNoPrecision() public function testTransformDoesNotRoundIfNoScale()
{ {
$transformer = new NumberToLocalizedStringTransformer(null, null, NumberToLocalizedStringTransformer::ROUND_DOWN); $transformer = new NumberToLocalizedStringTransformer(null, null, NumberToLocalizedStringTransformer::ROUND_DOWN);
@ -327,14 +327,14 @@ class NumberToLocalizedStringTransformerTest extends \PHPUnit_Framework_TestCase
/** /**
* @dataProvider reverseTransformWithRoundingProvider * @dataProvider reverseTransformWithRoundingProvider
*/ */
public function testReverseTransformWithRounding($precision, $input, $output, $roundingMode) public function testReverseTransformWithRounding($scale, $input, $output, $roundingMode)
{ {
$transformer = new NumberToLocalizedStringTransformer($precision, null, $roundingMode); $transformer = new NumberToLocalizedStringTransformer($scale, null, $roundingMode);
$this->assertEquals($output, $transformer->reverseTransform($input)); $this->assertEquals($output, $transformer->reverseTransform($input));
} }
public function testReverseTransformDoesNotRoundIfNoPrecision() public function testReverseTransformDoesNotRoundIfNoScale()
{ {
$transformer = new NumberToLocalizedStringTransformer(null, null, NumberToLocalizedStringTransformer::ROUND_DOWN); $transformer = new NumberToLocalizedStringTransformer(null, null, NumberToLocalizedStringTransformer::ROUND_DOWN);

View File

@ -53,7 +53,7 @@ class PercentToLocalizedStringTransformerTest extends \PHPUnit_Framework_TestCas
$this->assertEquals('16', $transformer->transform(15.9)); $this->assertEquals('16', $transformer->transform(15.9));
} }
public function testTransformWithPrecision() public function testTransformWithScale()
{ {
$transformer = new PercentToLocalizedStringTransformer(2); $transformer = new PercentToLocalizedStringTransformer(2);
@ -87,7 +87,7 @@ class PercentToLocalizedStringTransformerTest extends \PHPUnit_Framework_TestCas
$this->assertEquals(200, $transformer->reverseTransform('200')); $this->assertEquals(200, $transformer->reverseTransform('200'));
} }
public function testReverseTransformWithPrecision() public function testReverseTransformWithScale()
{ {
$transformer = new PercentToLocalizedStringTransformer(2); $transformer = new PercentToLocalizedStringTransformer(2);

View File

@ -44,9 +44,9 @@ class NumberTypeTest extends TestCase
$this->assertSame('12.345,679', $view->vars['value']); $this->assertSame('12.345,679', $view->vars['value']);
} }
public function testDefaultFormattingWithPrecision() public function testDefaultFormattingWithScale()
{ {
$form = $this->factory->create('number', null, array('precision' => 2)); $form = $this->factory->create('number', null, array('scale' => 2));
$form->setData('12345.67890'); $form->setData('12345.67890');
$view = $form->createView(); $view = $form->createView();
@ -55,7 +55,7 @@ class NumberTypeTest extends TestCase
public function testDefaultFormattingWithRounding() public function testDefaultFormattingWithRounding()
{ {
$form = $this->factory->create('number', null, array('precision' => 0, 'rounding_mode' => \NumberFormatter::ROUND_UP)); $form = $this->factory->create('number', null, array('scale' => 0, 'rounding_mode' => \NumberFormatter::ROUND_UP));
$form->setData('12345.54321'); $form->setData('12345.54321');
$view = $form->createView(); $view = $form->createView();