. */ declare(strict_types=1); namespace App\Services\Formatters; use App\Entity\PriceInformations\Currency; use App\Settings\SystemSettings\LocalizationSettings; use Locale; use NumberFormatter; class MoneyFormatter { protected string $locale; public function __construct(private readonly LocalizationSettings $localizationSettings) { $this->locale = Locale::getDefault(); } /** * Format the given value in the given currency. * * @param string|float $value the value that should be formatted * @param Currency|null $currency The currency that should be used for formatting. If null the global one is used * @param int $decimals the number of decimals that should be shown * @param bool $show_all_digits if set to true, all digits are shown, even if they are null */ public function format(string|float $value, ?Currency $currency = null, int $decimals = 5, bool $show_all_digits = false): string { $iso_code = $this->localizationSettings->baseCurrency; if ($currency instanceof Currency && ($currency->getIsoCode() !== null && $currency->getIsoCode() !== '')) { $iso_code = $currency->getIsoCode(); } $number_formatter = new NumberFormatter($this->locale, NumberFormatter::CURRENCY); if ($show_all_digits) { $number_formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, $decimals); } else { $number_formatter->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, $decimals); } return $number_formatter->formatCurrency((float) $value, $iso_code); } }