8000 bug #36578 [Form] deprecate not using a rounding mode (xabbuh) · symfony/symfony@3a6f8ca · GitHub
[go: up one dir, main page]

Skip to content

Commit 3a6f8ca

Browse files
committed
bug #36578 [Form] deprecate not using a rounding mode (xabbuh)
This PR was merged into the 5.1-dev branch. Discussion ---------- [Form] deprecate not using a rounding mode | Q | A | ------------- | --- | Branch? | master | Bug fix? | yes | New feature? | no | Deprecations? | yes | Tickets | | License | MIT | Doc PR | Commits ------- 25ba1a2 deprecate not using a rounding mode
2 parents 669b7f1 + 25ba1a2 commit 3a6f8ca

File tree

7 files changed

+144
-39
lines changed

7 files changed

+144
-39
lines changed

UPGRADE-5.1.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ EventDispatcher
3939
Form
4040
----
4141

42+
* Not configuring the `rounding_mode` option of the `PercentType` is deprecated. It will default to `PercentToLocalizedStringTransformer::ROUND_HALF_UP` in Symfony 6.
43+
* Not passing a rounding mode to the constructor of `PercentToLocalizedStringTransformer` is deprecated. It will default to `ROUND_HALF_UP` in Symfony 6.
4244
* Implementing the `FormConfigInterface` without implementing the `getIsEmptyCallback()` method
4345
is deprecated. The method will be added to the interface in 6.0.
4446
* Implementing the `FormConfigBuilderInterface` without implementing the `setIsEmptyCallback()` method

UPGRADE-6.0.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ EventDispatcher
3939
Form
4040
----
4141

42+
* The default value of the `rounding_mode` option of the `PercentType` has been changed to `PercentToLocalizedStringTransformer::ROUND_HALF_UP`.
43+
* The default rounding mode of the `PercentToLocalizedStringTransformer` has been changed to `ROUND_HALF_UP`.
4244
* Added the `getIsEmptyCallback()` method to the `FormConfigInterface`.
4345
* Added the `setIsEmptyCallback()` method to the `FormConfigBuilderInterface`.
4446
* Added argument `callable|null $filter` to `ChoiceListFactoryInterface::createListFromChoices()` and `createListFromLoader()`.

src/Symfony/Component/Form/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ CHANGELOG
44
5.1.0
55
-----
66

7+
* Deprecated not configuring the `rounding_mode` option of the `PercentType`. It will default to `PercentToLocalizedStringTransformer::ROUND_HALF_UP` in Symfony 6.
8+
* Deprecated not passing a rounding mode to the constructor of `PercentToLocalizedStringTransformer`. It will default to `ROUND_HALF_UP` in Symfony 6.
79
* Added `collection_entry` block prefix to `CollectionType` entries
810
* Added a `choice_filter` option to `ChoiceType`
911
* Added argument `callable|null $filter` to `ChoiceListFactoryInterface::createListFromChoices()` and `createListFromLoader()` - not defining them is deprecated.

src/Symfony/Component/Form/Extension/Core/DataTransformer/PercentToLocalizedStringTransformer.php

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,7 @@ class PercentToLocalizedStringTransformer implements DataTransformerInterface
8080
self::INTEGER,
8181
];
8282

83-
protected $roundingMode;
84-
83+
private $roundingMode;
8584
private $type;
8685
private $scale;
8786

@@ -93,7 +92,7 @@ class PercentToLocalizedStringTransformer implements DataTransformerInterface
9392
*
9493
* @throws UnexpectedTypeException if the given value of type is unknown
9594
*/
96-
public function __construct(int $scale = null, string $type = null, ?int $roundingMode = self::ROUND_HALF_UP)
95+
public function __construct(int $scale = null, string $type = null, ?int $roundingMode = null)
9796
{
9897
if (null === $scale) {
9998
$scale = 0;
@@ -103,8 +102,8 @@ public function __construct(int $scale = null, string $type = null, ?int $roundi
103102
$type = self::FRACTIONAL;
104103
}
105104

106-
if (null === $roundingMode) {
107-
$roundingMode = self::ROUND_HALF_UP;
105+
if (null === $roundingMode && (\func_num_args() < 4 || func_get_arg(3))) {
106+
trigger_deprecation('symfony/form', '5.1', sprintf('Not passing a rounding mode to %s() is deprecated. Starting with Symfony 6.0 it will default to "%s::ROUND_HALF_UP".', __METHOD__, __CLASS__));
108107
}
109108

110109
if (!\in_array($type, self::$types, true)) {
@@ -235,7 +234,10 @@ protected function getNumberFormatter()
235234
$formatter = new \NumberFormatter(\Locale::getDefault(), \NumberFormatter::DECIMAL);
236235

237236
$formatter->setAttribute(\NumberFormatter::FRACTION_DIGITS, $this->scale);
238-
$formatter->setAttribute(\NumberFormatter::ROUNDING_MODE, $this->roundingMode);
237+
238+
if (null !== $this->roundingMode) {
239+
$formatter->setAttribute(\NumberFormatter::ROUNDING_MODE, $this->roundingMode);
240+
}
239241

240242
return $formatter;
241243
}

src/Symfony/Component/Form/Extension/Core/Type/PercentType.php

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
namespace Symfony\Component\Form\Extension\Core\Type;
1313

1414
use Symfony\Component\Form\AbstractType;
15-
use Symfony\Component\Form\Extension\Core\DataTransformer\NumberToLocalizedStringTransformer;
1615
use Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer;
1716
use Symfony\Component\Form\FormBuilderInterface;
1817
use Symfony\Component\Form\FormInterface;
1918
use Symfony\Component\Form\FormView;
19+
use Symfony\Component\OptionsResolver\Options;
2020
use Symfony\Component\OptionsResolver\OptionsResolver;
2121

2222
class PercentType extends AbstractType
@@ -29,7 +29,8 @@ public function buildForm(FormBuilderInterface $builder, array $options)
2929
$builder->addViewTransformer(new PercentToLocalizedStringTransformer(
3030
$options['scale'],
3131
$options['type'],
32-
$options['rounding_mode']
32+
$options['rounding_mode'],
33+
false
3334
));
3435
}
3536

@@ -48,7 +49,11 @@ public function configureOptions(OptionsResolver $resolver)
4849
{
4950
$resolver->setDefaults([
5051
'scale' => 0,
51-
'rounding_mode' => NumberToLocalizedStringTransformer::ROUND_HALF_UP,
52+
'rounding_mode' => function (Options $options) {
53+
trigger_deprecation('symfony/form', '5.1', sprintf('Not configuring the "rounding_mode" option is deprecated. It will default to "%s::ROUND_HALF_UP" in Symfony 6.0.', PercentToLocalizedStringTransformer::class));
54+
55+
return null;
56+
},
5257
'symbol' => '%',
5358
'type' => 'fractional',
5459
'compound' => false,
@@ -59,16 +64,24 @@ public function configureOptions(OptionsResolver $resolver)
5964
'integer',
6065
]);
6166
$resolver->setAllowedValues('rounding_mode', [
62-
NumberToLocalizedStringTransformer::ROUND_FLOOR,
63-
NumberToLocalizedStringTransformer::ROUND_DOWN,
64-
NumberToLocalizedStringTransformer::ROUND_HALF_DOWN,
65-
NumberToLocalizedStringTransformer::ROUND_HALF_EVEN,
66-
NumberToLocalizedStringTransformer::ROUND_HALF_UP,
67-
NumberToLocalizedStringTransformer::ROUND_UP,
68-
NumberToLocalizedStringTransformer::ROUND_CEILING,
67+
null,
68+
PercentToLocalizedStringTransformer::ROUND_FLOOR,
69+
PercentToLocalizedStringTransformer::ROUND_DOWN,
70+
PercentToLocalizedStringTransformer::ROUND_HALF_DOWN,
71+
PercentToLocalizedStringTransformer::ROUND_HALF_EVEN,
72+
PercentToLocalizedStringTransformer::ROUND_HALF_UP,
73+
PercentToLocalizedStringTransformer::ROUND_UP,
74+
PercentToLocalizedStringTransformer::ROUND_CEILING,
6975
]);
7076
$resolver->setAllowedTypes('scale', 'int');
7177
$resolver->setAllowedTypes('symbol', ['bool', 'string']);
78+
$resolver->setDeprecated('rounding_mode', 'symfony/form', '5.1', function (Options $options, $roundingMode) {
79+
if (null === $roundingMode) {
80+
return sprintf('Not configuring the "rounding_mode" option is deprecated. It will default to "%s::ROUND_HALF_UP" in Symfony 6.0.', PercentToLocalizedStringTransformer::class);
81+
}
82+
83+
return '';
84+
});
7285
}
7386

7487
/**

src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/PercentToLocalizedStringTransformerTest.php

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,14 @@
1212
namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;
1313

1414
use PHPUnit\Framework\TestCase;
15+
use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait;
1516
use Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer;
1617
use Symfony\Component\Intl\Util\IntlTestHelper;
1718

1819
class PercentToLocalizedStringTransformerTest extends TestCase
1920
{
21+
use ExpectDeprecationTrait;
22+
2023
private $defaultLocale;
2124

2225
protected function setUp(): void
@@ -32,7 +35,7 @@ protected function tearDown(): void
3235

3336
public function testTransform()
3437
{
35-
$transformer = new PercentToLocalizedStringTransformer();
38+
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
3639

3740
$this->assertEquals('10', $transformer->transform(0.1));
3841
$this->assertEquals('15', $transformer->transform(0.15));
@@ -42,14 +45,14 @@ public function testTransform()
4245

4346
public function testTransformEmpty()
4447
{
45-
$transformer = new PercentToLocalizedStringTransformer();
48+
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
4649

4750
$this->assertEquals('', $transformer->transform(null));
4851
}
4952

5053
public function testTransformWithInteger()
5154
{
52-
$transformer = new PercentToLocalizedStringTransformer(null, 'integer');
55+
$transformer = new PercentToLocalizedStringTransformer(null, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP);
5356

5457
$this->assertEquals('0', $transformer->transform(0.1));
5558
$this->assertEquals('1', $transformer->transform(1));
@@ -64,14 +67,26 @@ public function testTransformWithScale()
6467

6568
\Locale::setDefault('de_AT');
6669

67-
$transformer = new PercentToLocalizedStringTransformer(2);
70+
$transformer = new PercentToLocalizedStringTransformer(2, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
6871

6972
$this->assertEquals('12,34', $transformer->transform(0.1234));
7073
}
7174

75+
/**
76+
* @group legacy
77+
*/
78+
public function testReverseTransformWithScaleAndRoundingDisabled()
79+
{
80+
$this->expect 10000 Deprecation('Since symfony/form 5.1: Not passing a rounding mode to Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer::__construct() is deprecated. Starting with Symfony 6.0 it will default to Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer::ROUND_HALF_UP.');
81+
82+
$transformer = new PercentToLocalizedStringTransformer(2, PercentToLocalizedStringTransformer::FRACTIONAL);
83+
84+
$this->assertEquals(0.0123456, $transformer->reverseTransform('1.23456'));
85+
}
86+
7287
public function testReverseTransform()
7388
{
74-
$transformer = new PercentToLocalizedStringTransformer();
89+
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
7590

7691
$this->assertEquals(0.1, $transformer->reverseTransform('10'));
7792
$this->assertEquals(0.15, $transformer->reverseTransform('15'));
@@ -184,14 +199,14 @@ public function testReverseTransformWithRounding($type, $scale, $input, $output,
184199

185200
public function testReverseTransformEmpty()
186201
{
187-
$transformer = new PercentToLocalizedStringTransformer();
202+
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
188203

189204
$this->assertNull($transformer->reverseTransform(''));
190205
}
191206

192207
public function testReverseTransformWithInteger()
193208
{
194-
$transformer = new PercentToLocalizedStringTransformer(null, 'integer');
209+
$transformer = new PercentToLocalizedStringTransformer(null, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP);
195210

196211
$this->assertEquals(10, $transformer->reverseTransform('10'));
197212
$this->assertEquals(15, $transformer->reverseTransform('15'));
@@ -206,14 +221,14 @@ public function testReverseTransformWithScale()
206221

207222
\Locale::setDefault('de_AT');
208223

209-
$transformer = new PercentToLocalizedStringTransformer(2);
224+
$transformer = new PercentToLocalizedStringTransformer(2, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
210225

211226
$this->assertEquals(0.1234, $transformer->reverseTransform('12,34'));
212227
}
213228

214229
public function testTransformExpectsNumeric()
215230
{
216-
$transformer = new PercentToLocalizedStringTransformer();
231+
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
217232

218233
$this->expectException('Symfony\Component\Form\Exception\TransformationFailedException');
219234

@@ -222,7 +237,7 @@ public function testTransformExpectsNumeric()
222237

223238
public function testReverseTransformExpectsString()
224239
{
225-
$transformer = new PercentToLocalizedStringTransformer();
240+
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
226241

227242
$this->expectException('Symfony\Component\Form\Exception\TransformationFailedException');
228243

@@ -234,7 +249,7 @@ public function testDecimalSeparatorMayBeDotIfGroupingSeparatorIsNotDot()
234249
IntlTestHelper::requireFullIntl($this, '4.8.1.1');
235250

236251
\Locale::setDefault('fr');
237-
$transformer = new PercentToLocalizedStringTransformer(1, 'integer');
252+
$transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP);
238253

239254
// completely valid format
240255
$this->assertEquals(1234.5, $transformer->reverseTransform('1 234,5'));
@@ -253,7 +268,7 @@ public function testDecimalSeparatorMayNotBeDotIfGroupingSeparatorIsDot()
253268

254269
\Locale::setDefault('de_DE');
255270

256-
$transformer = new PercentToLocalizedStringTransformer(1, 'integer');
271+
$transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP);
257272

258273
$transformer->reverseTransform('1.234.5');
259274
}
@@ -266,7 +281,7 @@ public function testDecimalSeparatorMayNotBeDotIfGroupingSeparatorIsDotWithNoGro
266281

267282
\Locale::setDefault('de_DE');
268283

269-
$transformer = new PercentToLocalizedStringTransformer(1, 'integer');
284+
$transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP);
270285

271286
$transformer->reverseTransform('1234.5');
272287
}
@@ -277,7 +292,7 @@ public function testDecimalSeparatorMayBeDotIfGroupingSeparatorIsDotButNoGroupin
277292
IntlTestHelper::requireFullIntl($this, false);
278293

279294
\Locale::setDefault('fr');
280-
$transformer = new PercentToLocalizedStringTransformer(1, 'integer');
295+
$transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP);
281296

282297
$this->assertEquals(1234.5, $transformer->reverseTransform('1234,5'));
283298
$this->assertEquals(1234.5, $transformer->reverseTransform('1234.5'));
@@ -289,7 +304,7 @@ public function testDecimalSeparatorMayBeCommaIfGroupingSeparatorIsNotComma()
289304
IntlTestHelper::requireFullIntl($this, '4.8.1.1');
290305

291306
\Locale::setDefault('bg');
292-
$transformer = new PercentToLocalizedStringTransformer(1, 'integer');
307+
$transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP);
293308

294309
// completely valid format
295310
$this->assertEquals(1234.5, $transformer->reverseTransform('1 234.5'));
@@ -305,7 +320,7 @@ public function testDecimalSeparatorMayNotBeCommaIfGroupingSeparatorIsComma()
305320
$this->expectException('Symfony\Component\Form\Exception\TransformationFailedException');
306321
IntlTestHelper::requireFullIntl($this, '4.8.1.1');
307322

308-
$transformer = new PercentToLocalizedStringTransformer(1, 'integer');
323+
$transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP);
309324

310325
$transformer->reverseTransform('1,234,5');
311326
}
@@ -315,7 +330,7 @@ public function testDecimalSeparatorMayNotBeCommaIfGroupingSeparatorIsCommaWithN
315330
$this->expectException('Symfony\Component\Form\Exception\TransformationFailedException');
316331
IntlTestHelper::requireFullIntl($this, '4.8.1.1');
317332

318-
$transformer = new PercentToLocalizedStringTransformer(1, 'integer');
333+
$transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP);
319334

320335
$transformer->reverseTransform('1234,5');
321336
}
@@ -328,7 +343,7 @@ public function testDecimalSeparatorMayBeCommaIfGroupingSeparatorIsCommaButNoGro
328343

329344
$transformer = $this->getMockBuilder('Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer')
330345
->setMethods(['getNumberFormatter'])
331-
->setConstructorArgs([1, 'integer'])
346+
->setConstructorArgs([1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP])
332347
->getMock();
333348
$transformer->expects($this->any())
334349
->method('getNumberFormatter')
@@ -341,7 +356,7 @@ public function testDecimalSeparatorMayBeCommaIfGroupingSeparatorIsCommaButNoGro
341356
public function testReverseTransformDisallowsLeadingExtraCharacters()
342357
{
343358
$this->expectException('Symfony\Component\Form\Exception\TransformationFailedException');
344-
$transformer = new PercentToLocalizedStringTransformer();
359+
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
345360

346361
$transformer->reverseTransform('foo123');
347362
}
@@ -350,7 +365,7 @@ public function testReverseTransformDisallowsCenteredExtraCharacters()
350365
{
351366
$this->expectException('Symfony\Component\Form\Exception\TransformationFailedException');
352367
$this->expectExceptionMessage('The number contains unrecognized characters: "foo3"');
353-
$transformer = new PercentToLocalizedStringTransformer();
368+
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
354369

355370
$transformer->reverseTransform('12foo3');
356371
}
@@ -367,7 +382,7 @@ public function testReverseTransformDisallowsCenteredExtraCharactersMultibyte()
367382

368383
\Locale::setDefault('ru');
369384

370-
$transformer = new PercentToLocalizedStringTransformer();
385+
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
371386

372387
$transformer->reverseTransform("12\xc2\xa0345,67foo8");
373388
}
@@ -376,7 +391,7 @@ public function testReverseTransformDisallowsTrailingExtraCharacters()
376391
{
377392
$this->expectException('Symfony\Component\Form\Exception\TransformationFailedException');
378393
$this->expectExceptionMessage('The number contains unrecognized characters: "foo"');
379-
$transformer = new PercentToLocalizedStringTransformer();
394+
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
380395

381396
$transformer->reverseTransform('123foo');
382397
}
@@ -393,7 +408,7 @@ public function testReverseTransformDisallowsTrailingExtraCharactersMultibyte()
393408

394409
\Locale::setDefault('ru');
395410

396-
$transformer = new PercentToLocalizedStringTransformer();
411+
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
397412

398413
$transformer->reverseTransform("12\xc2\xa0345,678foo");
399414
}

0 commit comments

Comments
 (0)
0