From 6b6073f68585415c050c8b6bf0b17efa10cd6cb7 Mon Sep 17 00:00:00 2001 From: Catalin Dan Date: Wed, 9 Mar 2016 16:43:58 +0200 Subject: [PATCH 1/2] [Form] Fix INT64 cast to float in IntegerType. --- .../DataTransformer/NumberToLocalizedStringTransformer.php | 6 +++++- .../NumberToLocalizedStringTransformerTest.php | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php index 7cc3d5c805..acb75f2ca1 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php @@ -122,7 +122,11 @@ class NumberToLocalizedStringTransformer implements DataTransformerInterface $value = str_replace(',', $decSep, $value); } - $result = $formatter->parse($value, \NumberFormatter::TYPE_DOUBLE, $position); + if (!strstr($value, $decSep) && PHP_INT_SIZE === 8) { + $result = $formatter->parse($value, \NumberFormatter::TYPE_INT64, $position); + } else { + $result = $formatter->parse($value, \NumberFormatter::TYPE_DOUBLE, $position); + } if (intl_is_failure($formatter->getErrorCode())) { throw new TransformationFailedException($formatter->getErrorMessage()); diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php index e829871ec3..ef9c9738cb 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php @@ -433,4 +433,11 @@ class NumberToLocalizedStringTransformerTest extends \PHPUnit_Framework_TestCase $transformer->reverseTransform("12\xc2\xa0345,678foo"); } + + public function testReverseTransformBigint() + { + $transformer = new NumberToLocalizedStringTransformer(null, true); + + $this->assertEquals(401657096594165125, (int) $transformer->reverseTransform((string) 401657096594165125)); + } } From 03c008cdbfa7c978fe76fc04b3077f1315b378d4 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Tue, 15 Mar 2016 16:33:36 +0100 Subject: [PATCH 2/2] [Form] Fix NumberToLocalizedStringTransformer::reverseTransform with big integers --- .../NumberToLocalizedStringTransformer.php | 10 +++++++--- .../NumberToLocalizedStringTransformerTest.php | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php index acb75f2ca1..a18eb957b5 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php @@ -122,12 +122,16 @@ class NumberToLocalizedStringTransformer implements DataTransformerInterface $value = str_replace(',', $decSep, $value); } - if (!strstr($value, $decSep) && PHP_INT_SIZE === 8) { - $result = $formatter->parse($value, \NumberFormatter::TYPE_INT64, $position); + if (false !== strpos($value, $decSep)) { + $type = \NumberFormatter::TYPE_DOUBLE; } else { - $result = $formatter->parse($value, \NumberFormatter::TYPE_DOUBLE, $position); + $type = PHP_INT_SIZE === 8 + ? \NumberFormatter::TYPE_INT64 + : \NumberFormatter::TYPE_INT32; } + $result = $formatter->parse($value, $type, $position); + if (intl_is_failure($formatter->getErrorCode())) { throw new TransformationFailedException($formatter->getErrorMessage()); } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php index ef9c9738cb..87cdf964c8 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php @@ -438,6 +438,6 @@ class NumberToLocalizedStringTransformerTest extends \PHPUnit_Framework_TestCase { $transformer = new NumberToLocalizedStringTransformer(null, true); - $this->assertEquals(401657096594165125, (int) $transformer->reverseTransform((string) 401657096594165125)); + $this->assertEquals(PHP_INT_MAX - 1, (int) $transformer->reverseTransform((string) (PHP_INT_MAX - 1))); } }