Skip to content

Commit

Permalink
Let NumberFormatter handle integer type casting
Browse files Browse the repository at this point in the history
Partially addresses #2389 by not mistakenly typecasting a boolean false into
an integer 0
  • Loading branch information
mrtorrent committed Oct 30, 2011
1 parent 68b7662 commit c9d05d7
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

use Symfony\Component\Form\Exception\TransformationFailedException;
use Symfony\Component\Form\Exception\UnexpectedTypeException;

/**
* Transforms between an integer and a localized number with grouping
* (each thousand) and comma separators.
Expand All @@ -24,8 +27,24 @@ class IntegerToLocalizedStringTransformer extends NumberToLocalizedStringTransfo
*/
public function reverseTransform($value)
{
$value = parent::reverseTransform($value);
if (!is_string($value)) {
throw new UnexpectedTypeException($value, 'string');
}

if ('' === $value) {
return null;
}

$formatter = $this->getNumberFormatter();
$value = $formatter->parse(
$value,
PHP_INT_SIZE == 8 ? $formatter::TYPE_INT64 : $formatter::TYPE_INT32
);

if (intl_is_failure($formatter->getErrorCode())) {
throw new TransformationFailedException($formatter->getErrorMessage());
}

return null === $value ? null : (int) $value;
return $value;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Tests\Component\Form\Extension\Core\DataTransformer;

require_once __DIR__ . '/LocalizedTestCase.php';

use Symfony\Component\Form\Extension\Core\DataTransformer\IntegerToLocalizedStringTransformer;

class IntegerToLocalizedStringTransformerTest extends LocalizedTestCase
{
protected function setUp()
{
parent::setUp();

\Locale::setDefault('de_AT');
}

public function testReverseTransform()
{
$transformer = new IntegerToLocalizedStringTransformer();

$this->assertEquals(1, $transformer->reverseTransform('1'));
$this->assertEquals(1, $transformer->reverseTransform('1,5'));
$this->assertEquals(1234, $transformer->reverseTransform('1234,5'));
$this->assertEquals(12345, $transformer->reverseTransform('12345,912'));
}

public function testReverseTransform_empty()
{
$transformer = new IntegerToLocalizedStringTransformer();

$this->assertSame(null, $transformer->reverseTransform(''));
}

public function testReverseTransformWithGrouping()
{
$transformer = new IntegerToLocalizedStringTransformer(null, true);

$this->assertEquals(1234, $transformer->reverseTransform('1.234,5'));
$this->assertEquals(12345, $transformer->reverseTransform('12.345,912'));
$this->assertEquals(1234, $transformer->reverseTransform('1234,5'));
$this->assertEquals(12345, $transformer->reverseTransform('12345,912'));
}

/**
* @expectedException Symfony\Component\Form\Exception\UnexpectedTypeException
*/
public function testReverseTransformExpectsString()
{
$transformer = new IntegerToLocalizedStringTransformer();

$transformer->reverseTransform(1);
}

/**
* @expectedException Symfony\Component\Form\Exception\TransformationFailedException
*/
public function testReverseTransformExpectsValidNumber()
{
$transformer = new IntegerToLocalizedStringTransformer();

$transformer->reverseTransform('foo');
}
}

0 comments on commit c9d05d7

Please sign in to comment.