Fix StringUtil::formatDouble() for $maxDecimals != 2
authorTim Düsterhus <duesterhus@woltlab.com>
Mon, 24 Jul 2023 07:26:21 +0000 (09:26 +0200)
committerTim Düsterhus <duesterhus@woltlab.com>
Mon, 24 Jul 2023 07:26:21 +0000 (09:26 +0200)
NumberFormatter performs rounding itself, thus there is no need to round
manually. This also changes the recommended alternative for this use case that
is mentioned in the doc comment.

wcfsetup/install/files/lib/util/StringUtil.class.php

index f5aa729956a6cffbd4e4361a2b42dff67aea7c29..e1dce90c191dfe6d5bad5dc5ffbe595c96994a1e 100644 (file)
@@ -182,19 +182,27 @@ final class StringUtil
     /**
      * Formats a double.
      *
-     * @deprecated 6.0 Use `formatNumeric()` instead, apply `\round()` manually if required.
+     * @deprecated 6.0 Use `formatNumeric()` instead. Create a custom NumberFormatter for more / less than 2 decimals.
      */
     public static function formatDouble(float $double, int $maxDecimals = 0): string
     {
-        $double = \round($double, ($maxDecimals > 0 ? $maxDecimals : 2));
+        $maxDecimals = ($maxDecimals > 0 ? $maxDecimals : 2);
 
-        $double = self::getNumberFormatter()->format($double);
+        if ($maxDecimals === 2) {
+            return self::formatNumeric($double);
+        }
+
+        $locale = WCF::getLanguage()->getLocale();
+        $formatter = new \NumberFormatter($locale, \NumberFormatter::DEFAULT_STYLE);
+        $formatter->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, $maxDecimals);
+
+        $formatted = $formatter->format($double);
 
         if ($double < 0) {
-            $double = self::formatNegative($double);
+            $formatted = self::formatNegative($formatted);
         }
 
-        return $double;
+        return $formatted;
     }
 
     /**