From a6cf3f3f37e095811cc8513a7b54db996d2f229d Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Fri, 15 Nov 2019 17:42:13 +0100 Subject: [PATCH] Fix number formatter in Intl extra extension --- CHANGELOG | 2 +- drupal_test.sh | 2 +- extra/intl-extra/src/IntlExtension.php | 30 ++++++++++++-------- extra/intl-extra/tests/IntlExtensionTest.php | 28 ++++++++++++++++++ 4 files changed, 48 insertions(+), 14 deletions(-) create mode 100644 extra/intl-extra/tests/IntlExtensionTest.php diff --git a/CHANGELOG b/CHANGELOG index bec3e3001..930da743e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,6 @@ * 2.12.3 (2019-XX-XX) - * n/a + * fixed number formatter in Intl extra extension when using a formatter prototype * 2.12.2 (2019-11-11) diff --git a/drupal_test.sh b/drupal_test.sh index 3bc1f08ab..67dc0bd07 100755 --- a/drupal_test.sh +++ b/drupal_test.sh @@ -18,7 +18,7 @@ source output wget https://get.symfony.com/cli/installer -O - | bash export PATH="$HOME/.symfony/bin:$PATH" symfony server:start -d --no-tls -ENDPOINT=`symfony server:status -no-ansi | sed -E 's/^.+ http/http/'` +ENDPOINT=`symfony var:export SYMFONY_DEFAULT_ROUTE_URL` curl -OLsS https://get.blackfire.io/blackfire-player.phar chmod +x blackfire-player.phar diff --git a/extra/intl-extra/src/IntlExtension.php b/extra/intl-extra/src/IntlExtension.php index dd5b7733f..8bf122605 100644 --- a/extra/intl-extra/src/IntlExtension.php +++ b/extra/intl-extra/src/IntlExtension.php @@ -77,7 +77,7 @@ final class IntlExtension extends AbstractExtension 'halfdown' => \NumberFormatter::ROUND_HALFDOWN, 'halfup' => \NumberFormatter::ROUND_HALFUP, ]; - private const NUMBER_PADDONG_ATTRIBUTES = [ + private const NUMBER_PADDING_ATTRIBUTES = [ 'before_prefix' => \NumberFormatter::PAD_BEFORE_PREFIX, 'after_prefix' => \NumberFormatter::PAD_AFTER_PREFIX, 'before_suffix' => \NumberFormatter::PAD_BEFORE_SUFFIX, @@ -305,18 +305,24 @@ final class IntlExtension extends AbstractExtension $textAttrs = []; $symbols = []; if ($this->numberFormatterPrototype) { - foreach (self::NUMBER_ATTRIBUTES as $name) { + foreach (self::NUMBER_ATTRIBUTES as $name => $const) { if (!isset($attrs[$name])) { - $attrs[$name] = $this->numberFormatterPrototype->getAttribute($name); + $value = $this->numberFormatterPrototype->getAttribute($const); + if ('rounding_mode' === $name) { + $value = array_flip(self::NUMBER_ROUNDING_ATTRIBUTES)[$value]; + } elseif ('padding_position' === $name) { + $value = array_flip(self::NUMBER_PADDING_ATTRIBUTES)[$value]; + } + $attrs[$name] = $value; } } - foreach (self::NUMBER_TEXT_ATTRIBUTES as $name) { - $textAttrs[$name] = $this->numberFormatterPrototype->getTextAttribute($name); + foreach (self::NUMBER_TEXT_ATTRIBUTES as $name => $const) { + $textAttrs[$name] = $this->numberFormatterPrototype->getTextAttribute($const); } - foreach (self::NUMBER_SYMBOLS as $name) { - $symbols[$name] = $this->numberFormatterPrototype->getSymbol($name); + foreach (self::NUMBER_SYMBOLS as $name => $const) { + $symbols[$name] = $this->numberFormatterPrototype->getSymbol($const); } } @@ -339,22 +345,22 @@ final class IntlExtension extends AbstractExtension $value = self::NUMBER_ROUNDING_ATTRIBUTES[$value]; } elseif ('padding_position' === $name) { - if (!isset(self::NUMBER_PADDONG_ATTRIBUTES[$value])) { - throw new RuntimeError(sprintf('The number formatter padding position "%s" does not exist, known positions are: "%s".', $value, implode('", "', array_keys(self::NUMBER_PADDONG_ATTRIBUTES)))); + if (!isset(self::NUMBER_PADDING_ATTRIBUTES[$value])) { + throw new RuntimeError(sprintf('The number formatter padding position "%s" does not exist, known positions are: "%s".', $value, implode('", "', array_keys(self::NUMBER_PADDING_ATTRIBUTES)))); } - $value = self::NUMBER_PADDONG_ATTRIBUTES[$value]; + $value = self::NUMBER_PADDING_ATTRIBUTES[$value]; } $this->numberFormatters[$hash]->setAttribute(self::NUMBER_ATTRIBUTES[$name], $value); } foreach ($textAttrs as $name => $value) { - $this->numberFormatters[$hash]->setTextAttribute($name, $value); + $this->numberFormatters[$hash]->setTextAttribute(self::NUMBER_TEXT_ATTRIBUTES[$name], $value); } foreach ($symbols as $name => $value) { - $this->numberFormatters[$hash]->setSymbol($name, $value); + $this->numberFormatters[$hash]->setSymbol(self::NUMBER_SYMBOLS[$name], $value); } return $this->numberFormatters[$hash]; diff --git a/extra/intl-extra/tests/IntlExtensionTest.php b/extra/intl-extra/tests/IntlExtensionTest.php new file mode 100644 index 000000000..f26376206 --- /dev/null +++ b/extra/intl-extra/tests/IntlExtensionTest.php @@ -0,0 +1,28 @@ +setTextAttribute(\NumberFormatter::POSITIVE_PREFIX, '++'); + $numberFormatterProto->setAttribute(\NumberFormatter::FRACTION_DIGITS, 1); + $ext = new IntlExtension($dateFormatterProto, $numberFormatterProto); + $this->assertSame('++12,3', $ext->formatNumber('12.3456')); + } +}