'', 'after' => '', 'places' => 2, 'thousands' => static::$_thousands, 'decimals' => static::$_decimals, 'escape' => false]; $options = $formatOptions + $defaults; if (!empty($options['currency'])) { if (!empty(static::$_symbolRight)) { $options['after'] = ' ' . static::$_symbolRight; } elseif (!empty(static::$_symbolLeft)) { $options['before'] = static::$_symbolLeft . ' '; } } /* if ($spacer !== false) { $spacer = ($spacer === true) ? ' ' : $spacer; if ((string)$before !== '') { $before .= $spacer; } if ((string)$after !== '') { $after = $spacer . $after; } } */ if ($options['places'] < 0) { $number = round($number, $options['places']); } $sign = ''; if ($number > 0 && !empty($options['signed'])) { $sign = '+'; } if (isset($options['signed'])) { unset($options['signed']); } return $sign . parent::format($number, $options); } /** * Format * * Additional options * - signed * - positive * * @param float $number * @param array $options * @return string */ public static function format($number, array $options = []): string { $defaults = [ 'positive' => '+', 'signed' => false, ]; $options += $defaults; $sign = ''; if ($number > 0 && !empty($options['signed'])) { $sign = '+'; } if (isset($options['signed'])) { unset($options['signed']); } return $sign . parent::format($number, $options); } /** * Overwrite to allow * * - signed: true/false * * @param string|float|int $value * @param string|null $currency * @param array $options * * @return string */ public static function currency(string|float|int $value, ?string $currency = null, array $options = []): string { $defaults = [ 'positive' => '+', 'signed' => false, ]; $options += $defaults; $sign = ''; if ($value > 0 && !empty($options['signed'])) { $sign = $options['positive']; } return $sign . parent::currency($value, $currency, $options); } /** * Get the rounded average. * * @param array $values Values: int or float values * @param int $precision * * @return float Average */ public static function average(array $values, int $precision = 0): float { if (!$values) { return 0.0; } return round(array_sum($values) / count($values), $precision); } /** * Round value. * * @param float $number * @param float $increment * @return float result */ public static function roundTo($number, $increment = 1.0) { $precision = static::getDecimalPlaces($increment); $res = round($number, $precision); if ($precision <= 0) { $res = (int)$res; } return $res; } /** * Round value up. * * @param float $number * @param int $increment * * @return float|int Result */ public static function roundUpTo($number, int $increment = 1) { return ceil($number / $increment) * $increment; } /** * Round value down. * * @param float $number * @param int $increment * * @return float result */ public static function roundDownTo($number, int $increment = 1) { return floor($number / $increment) * $increment; } /** * Get decimal places * * @param float $number * @return int decimalPlaces */ public static function getDecimalPlaces($number): int { $decimalPlaces = 0; while ($number > 1 && $number != 0) { $number /= 10; $decimalPlaces -= 1; } while ($number < 1 && $number != 0) { $number *= 10; $decimalPlaces += 1; } return $decimalPlaces; } /** * Can compare two float values * * @link http://php.net/manual/en/language.types.float.php * @param float $x * @param float $y * @param float $precision * @return bool */ public static function isFloatEqual($x, $y, $precision = 0.0000001): bool { return ($x + $precision >= $y) && ($x - $precision <= $y); } /** * Get the settings for a specific formatName * * @param string $formatName (EUR, ...) * * @return array currencySettings */ public static function getFormat(string $formatName): array { if (!isset(static::$_currencies[$formatName])) { return []; } return static::$_currencies[$formatName]; } }