Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 3a6f8ca

Browse filesBrowse 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
Copy full SHA for 3a6f8ca

File tree

7 files changed

+144
-39
lines changed
Filter options

7 files changed

+144
-39
lines changed

‎UPGRADE-5.1.md

Copy file name to clipboardExpand all lines: UPGRADE-5.1.md
+2Lines 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

Copy file name to clipboardExpand all lines: UPGRADE-6.0.md
+2Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/CHANGELOG.md
+2Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/Extension/Core/DataTransformer/PercentToLocalizedStringTransformer.php
+8-6Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/Extension/Core/Type/PercentType.php
+23-10Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/PercentToLocalizedStringTransformerTest.php
+38-23Lines 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->expectDeprecation('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)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.