diff --git a/framework/i18n/Formatter.php b/framework/i18n/Formatter.php index 6229974161..c0ac6200f6 100644 --- a/framework/i18n/Formatter.php +++ b/framework/i18n/Formatter.php @@ -145,6 +145,7 @@ class Formatter extends Component public $numberFormatterTextOptions = []; /** * @var string the 3-letter ISO 4217 currency code indicating the default currency to use for [[asCurrency]]. + * If not set, the currency code corresponding to [[locale]] will be used. */ public $currencyCode; /** @@ -987,6 +988,7 @@ class Formatter extends Component * * @param mixed $value the value to be formatted. * @param string $currency the 3-letter ISO 4217 currency code indicating the currency to use. + * If null, [[currencyCode]] will be used. * @param array $options optional configuration for the number formatter. This parameter will be merged with [[numberFormatterOptions]]. * @param array $textOptions optional configuration for the number formatter. This parameter will be merged with [[numberFormatterTextOptions]]. * @return string the formatted result. @@ -1000,16 +1002,23 @@ class Formatter extends Component } $value = $this->normalizeNumericValue($value); - if ($currency === null) { - if ($this->currencyCode === null) { - throw new InvalidConfigException('The default currency code for the formatter is not defined.'); - } - $currency = $this->currencyCode; - } if ($this->_intlLoaded) { $formatter = $this->createNumberFormatter(NumberFormatter::CURRENCY, null, $options, $textOptions); + if ($currency === null) { + if ($this->currencyCode === null) { + $currency = $formatter->getSymbol(NumberFormatter::INTL_CURRENCY_SYMBOL); + } else { + $currency = $this->currencyCode; + } + } return $formatter->formatCurrency($value, $currency); } else { + if ($currency === null) { + if ($this->currencyCode === null) { + throw new InvalidConfigException('The default currency code for the formatter is not defined.'); + } + $currency = $this->currencyCode; + } return $currency . ' ' . $this->asDecimal($value, 2, $options, $textOptions); } } diff --git a/tests/unit/framework/i18n/FormatterTest.php b/tests/unit/framework/i18n/FormatterTest.php index 8aaedb20d8..9be569840d 100644 --- a/tests/unit/framework/i18n/FormatterTest.php +++ b/tests/unit/framework/i18n/FormatterTest.php @@ -546,7 +546,12 @@ class FormatterTest extends TestCase public function testIntlAsCurrency() { - $this->formatter->locale = 'en_US'; + $this->formatter->locale = 'en-US'; + $this->assertSame('$123.00', $this->formatter->asCurrency('123')); + $this->assertSame('$123,456.00', $this->formatter->asCurrency('123456')); + $this->assertSame('$0.00', $this->formatter->asCurrency('0')); + + $this->formatter->locale = 'en-US'; $this->formatter->currencyCode = 'USD'; $this->assertSame('$123.00', $this->formatter->asCurrency('123')); $this->assertSame('$123,456.00', $this->formatter->asCurrency('123456')); @@ -556,7 +561,9 @@ class FormatterTest extends TestCase // $value = '-123456.123'; // $this->assertSame("($123,456.12)", $this->formatter->asCurrency($value)); - $this->formatter->locale = 'de_DE'; + $this->formatter->locale = 'de-DE'; + $this->formatter->currencyCode = null; + $this->assertSame('123,00 €', $this->formatter->asCurrency('123')); $this->formatter->currencyCode = 'USD'; $this->assertSame('123,00 $', $this->formatter->asCurrency('123')); $this->formatter->currencyCode = 'EUR';