[TASK] Streamline phpdoc annotations in EXT:fluid
[Packages/TYPO3.CMS.git] / typo3 / sysext / fluid / Classes / ViewHelpers / Format / CurrencyViewHelper.php
index 704b43c..7861543 100644 (file)
@@ -14,8 +14,9 @@ namespace TYPO3\CMS\Fluid\ViewHelpers\Format;
  * The TYPO3 project - inspiring people to share!
  */
 
-use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper;
 use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
+use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
+use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
 
 /**
  * Formats a given float to a currency representation.
@@ -30,7 +31,7 @@ use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
  * </output>
  *
  * <code title="All parameters">
- * <f:format.currency currencySign="$" decimalSeparator="." thousandsSeparator="," prependCurrency="TRUE" separateCurrency="FALSE" decimals="2">54321</f:format.currency>
+ * <f:format.currency currencySign="$" decimalSeparator="." thousandsSeparator="," prependCurrency="true" separateCurrency="false" decimals="2">54321</f:format.currency>
  * </code>
  * <output>
  * $54,321.00
@@ -44,42 +45,48 @@ use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
  * (depending on the value of {someNumber})
  * </output>
  *
- * @api
+ * <code title="use dash for decimals without value">
+ * <f:format.currency useDash="true">123.00</f:format.currency>
+ * </code>
+ * <output>
+ * 123,-
+ * </output>
  */
 class CurrencyViewHelper extends AbstractViewHelper
 {
+    use CompileWithRenderStatic;
+
     /**
-     * @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.
-     * @param bool $prependCurrency (optional) Select if the curreny sign should be prepended
-     * @param bool $separateCurrency (optional) Separate the currency sign from the number by a single space, defaults to true due to backwards compatibility
-     * @param int $decimals (optional) Set decimals places.
-     * @return string the formatted amount.
-     * @api
+     * Output is escaped already. We must not escape children, to avoid double encoding.
+     *
+     * @var bool
      */
-    public function render($currencySign = '', $decimalSeparator = ',', $thousandsSeparator = '.', $prependCurrency = false, $separateCurrency = true, $decimals = 2)
+    protected $escapeChildren = false;
+
+    /**
+     * Initialize arguments.
+     *
+     * @throws \TYPO3Fluid\Fluid\Core\ViewHelper\Exception
+     */
+    public function initializeArguments()
     {
-        return static::renderStatic(
-            array(
-                'currencySign' => $currencySign,
-                'decimalSeparator' => $decimalSeparator,
-                'thousandsSeparator' => $thousandsSeparator,
-                'prependCurrency' => $prependCurrency,
-                'separateCurrency' => $separateCurrency,
-                'decimals' => $decimals
-            ),
-            $this->buildRenderChildrenClosure(),
-            $this->renderingContext
-        );
+        $this->registerArgument('currencySign', 'string', 'The currency sign, eg $ or €.', false, '');
+        $this->registerArgument('decimalSeparator', 'string', 'The separator for the decimal point.', false, ',');
+        $this->registerArgument('thousandsSeparator', 'string', 'The thousands separator.', false, '.');
+        $this->registerArgument('prependCurrency', 'bool', 'Select if the currency sign should be prepended', false, false);
+        $this->registerArgument('separateCurrency', 'bool', 'Separate the currency sign from the number by a single space, defaults to true due to backwards compatibility', false, true);
+        $this->registerArgument('decimals', 'int', 'Set decimals places.', false, 2);
+        $this->registerArgument('useDash', 'bool', 'Use the dash instead of decimal 00', false, false);
     }
 
     /**
+     * Formats a float to currency formatting
+     *
      * @param array $arguments
-     * @param callable $renderChildrenClosure
+     * @param \Closure $renderChildrenClosure
      * @param RenderingContextInterface $renderingContext
      *
-     * @return string
+     * @return string the formatted amount
      */
     public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
     {
@@ -89,14 +96,20 @@ class CurrencyViewHelper extends AbstractViewHelper
         $prependCurrency = $arguments['prependCurrency'];
         $separateCurrency = $arguments['separateCurrency'];
         $decimals = $arguments['decimals'];
+        $useDash = $arguments['useDash'];
 
         $floatToFormat = $renderChildrenClosure();
         if (empty($floatToFormat)) {
             $floatToFormat = 0.0;
         } else {
-            $floatToFormat = floatval($floatToFormat);
+            $floatToFormat = (float)$floatToFormat;
         }
         $output = number_format($floatToFormat, $decimals, $decimalSeparator, $thousandsSeparator);
+
+        if ($useDash && $floatToFormat === floor($floatToFormat)) {
+            $output = explode($decimalSeparator, $output)[0] . $decimalSeparator . '—';
+        }
+
         if ($currencySign !== '') {
             $currencySeparator = $separateCurrency ? ' ' : '';
             if ($prependCurrency === true) {