/** * Format the numeric value as a number with grouped thousands, decimal point and * precision. * * @param int $decimals The number of digits after the decimal point * @param string $decimalSeparator The decimal point character * @param string $thousandsSeparator The character for grouping the thousand digits * @param string $localeFormatLength Format length if locale set in $forceLocale. Must be one of Neos\Flow\I18n\Cldr\Reader\NumbersReader::FORMAT_LENGTH_*'s constants. * @return string The formatted number * @api * @throws ViewHelperException */ public function render($decimals = 2, $decimalSeparator = '.', $thousandsSeparator = ',', $localeFormatLength = NumbersReader::FORMAT_LENGTH_DEFAULT) { $stringToFormat = $this->renderChildren(); $useLocale = $this->getLocale(); if ($useLocale !== null) { try { $output = $this->numberFormatter->formatDecimalNumber($stringToFormat, $useLocale, $localeFormatLength); } catch (I18nException $exception) { throw new ViewHelperException($exception->getMessage(), 1382351148, $exception); } } else { $output = number_format((double) $stringToFormat, $decimals, $decimalSeparator, $thousandsSeparator); } return $output; }
/** * @param string $currencySign (optional) The currency sign, eg $ or €. * @param string $decimalSeparator (optional) The separator for the decimal point. * @param string $thousandsSeparator (optional) The thousands separator. * * @throws InvalidVariableException * @return string the formatted amount. * @throws ViewHelperException * @api */ public function render($currencySign = '', $decimalSeparator = ',', $thousandsSeparator = '.') { $stringToFormat = $this->renderChildren(); $useLocale = $this->getLocale(); if ($useLocale !== null) { if ($currencySign === '') { throw new InvalidVariableException('Using the Locale requires a currencySign.', 1326378320); } try { $output = $this->numberFormatter->formatCurrencyNumber($stringToFormat, $useLocale, $currencySign); } catch (I18nException $exception) { throw new ViewHelperException($exception->getMessage(), 1382350428, $exception); } } else { $output = number_format((double) $stringToFormat, 2, $decimalSeparator, $thousandsSeparator); if ($currencySign !== '') { $output .= ' ' . $currencySign; } } return $output; }
/** * @test * @dataProvider sampleDataForSpecificFormattingMethods */ public function specificFormattingMethodsWork($number, array $parsedFormat, $expectedResult, $formatType, $currencySign = null) { $mockNumbersReader = $this->createMock(I18n\Cldr\Reader\NumbersReader::class); $mockNumbersReader->expects($this->once())->method('parseFormatFromCldr')->with($this->sampleLocale, $formatType, 'default')->will($this->returnValue($parsedFormat)); $mockNumbersReader->expects($this->once())->method('getLocalizedSymbolsForLocale')->with($this->sampleLocale)->will($this->returnValue($this->sampleLocalizedSymbols)); $formatter = new I18n\Formatter\NumberFormatter(); $formatter->injectNumbersReader($mockNumbersReader); if ($formatType === 'currency') { $result = $formatter->formatCurrencyNumber($number, $this->sampleLocale, $currencySign); } else { $methodName = 'format' . ucfirst($formatType) . 'Number'; $result = $formatter->{$methodName}($number, $this->sampleLocale); } $this->assertEquals($expectedResult, $result); }