From a305eb063d40f0a01d77792e7b502a95a89be86f Mon Sep 17 00:00:00 2001 From: Brandon Turner Date: Fri, 24 Sep 2010 13:35:34 -0500 Subject: [PATCH] [Form] added support for rounding-mode option on NumberFields --- src/Symfony/Component/Form/NumberField.php | 2 ++ .../NumberToLocalizedStringTransformer.php | 10 ++++++++++ .../NumberToLocalizedStringTransformerTest.php | 17 +++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/src/Symfony/Component/Form/NumberField.php b/src/Symfony/Component/Form/NumberField.php index 793ce6cd11..4f864135ad 100644 --- a/src/Symfony/Component/Form/NumberField.php +++ b/src/Symfony/Component/Form/NumberField.php @@ -27,10 +27,12 @@ class NumberField extends InputField // default precision is locale specific (usually around 3) $this->addOption('precision'); $this->addOption('grouping', false); + $this->addOption('rounding-mode', NumberToLocalizedStringTransformer::ROUND_HALFUP); $this->setValueTransformer(new NumberToLocalizedStringTransformer(array( 'precision' => $this->getOption('precision'), 'grouping' => $this->getOption('grouping'), + 'rounding-mode' => $this->getOption('rounding-mode'), ))); } diff --git a/src/Symfony/Component/Form/ValueTransformer/NumberToLocalizedStringTransformer.php b/src/Symfony/Component/Form/ValueTransformer/NumberToLocalizedStringTransformer.php index e0534f99be..0ab01a5fad 100644 --- a/src/Symfony/Component/Form/ValueTransformer/NumberToLocalizedStringTransformer.php +++ b/src/Symfony/Component/Form/ValueTransformer/NumberToLocalizedStringTransformer.php @@ -13,6 +13,14 @@ use \Symfony\Component\Form\ValueTransformer\ValueTransformerException; */ class NumberToLocalizedStringTransformer extends BaseValueTransformer { + const ROUND_FLOOR = \NumberFormatter::ROUND_FLOOR; + const ROUND_DOWN = \NumberFormatter::ROUND_DOWN; + const ROUND_HALFDOWN = \NumberFormatter::ROUND_HALFDOWN; + const ROUND_HALFEVEN = \NumberFormatter::ROUND_HALFEVEN; + const ROUND_HALFUP = \NumberFormatter::ROUND_HALFUP; + const ROUND_UP = \NumberFormatter::ROUND_UP; + const ROUND_CEILING = \NumberFormatter::ROUND_CEILING; + /** * {@inheritDoc} */ @@ -20,6 +28,7 @@ class NumberToLocalizedStringTransformer extends BaseValueTransformer { $this->addOption('precision', null); $this->addOption('grouping', false); + $this->addOption('rounding-mode', self::ROUND_HALFUP); parent::configure(); } @@ -78,6 +87,7 @@ class NumberToLocalizedStringTransformer extends BaseValueTransformer if ($this->getOption('precision') !== null) { $formatter->setAttribute(\NumberFormatter::FRACTION_DIGITS, $this->getOption('precision')); + $formatter->setAttribute(\NumberFormatter::ROUNDING_MODE, $this->getOption('rounding-mode')); } $formatter->setAttribute(\NumberFormatter::GROUPING_USED, $this->getOption('grouping')); diff --git a/tests/Symfony/Tests/Component/Form/ValueTransformer/NumberToLocalizedStringTransformerTest.php b/tests/Symfony/Tests/Component/Form/ValueTransformer/NumberToLocalizedStringTransformerTest.php index cf1d7d340a..0bab2e0ad6 100644 --- a/tests/Symfony/Tests/Component/Form/ValueTransformer/NumberToLocalizedStringTransformerTest.php +++ b/tests/Symfony/Tests/Component/Form/ValueTransformer/NumberToLocalizedStringTransformerTest.php @@ -43,6 +43,23 @@ class NumberToLocalizedStringTransformerTest extends LocalizedTestCase $this->assertEquals('678,92', $transformer->transform(678.916)); } + public function testTransformWithRoundingMode() + { + $transformer = new NumberToLocalizedStringTransformer(array( + 'rounding-mode' => NumberToLocalizedStringTransformer::ROUND_DOWN, + )); + $transformer->setLocale('de_AT'); + $this->assertEquals('1234,547', $transformer->transform(1234.547), '->transform() only applies rounding mode if precision set'); + + $transformer = new NumberToLocalizedStringTransformer(array( + 'rounding-mode' => NumberToLocalizedStringTransformer::ROUND_DOWN, + 'precision' => 2, + )); + $transformer->setLocale('de_AT'); + $this->assertEquals('1234,54', $transformer->transform(1234.547), '->transform() rounding-mode works'); + + } + public function testReverseTransform() { $transformer = new NumberToLocalizedStringTransformer();