X-Git-Url: https://git.rapsys.eu/packbundle/blobdiff_plain/f20e37360674d48c164ad95ce0105d7f5f5014ef..013e3b68170a39d007a29ef45ea0eb222fbcb2d8:/Util/IntlUtil.php diff --git a/Util/IntlUtil.php b/Util/IntlUtil.php index b37169d..511e948 100644 --- a/Util/IntlUtil.php +++ b/Util/IntlUtil.php @@ -18,6 +18,17 @@ use Twig\Environment; * Manages intl conversions */ class IntlUtil { + /** + * Format currency + */ + public function currency(int|float $number, string $currency, ?string $locale = null) { + //Get formatter + $formatter = $this->getNumberFormatter($locale, 'currency'); + + //Return formatted currency + return $formatter->formatCurrency($number, $currency); + } + /** * Format date */ @@ -48,42 +59,6 @@ class IntlUtil { return $formatter->format($date->getTimestamp()); } - /** - * Format number - */ - public function number(int|float $number, $style = 'decimal', $type = 'default', ?string $locale = null) { - //Set types - static $types = [ - 'default' => NumberFormatter::TYPE_DEFAULT, - 'int32' => NumberFormatter::TYPE_INT32, - 'int64' => NumberFormatter::TYPE_INT64, - 'double' => NumberFormatter::TYPE_DOUBLE, - 'currency' => NumberFormatter::TYPE_CURRENCY, - ]; - - //Get formatter - $formatter = $this->getNumberFormatter($locale, $style); - - //Without type - if (!isset($types[$type])) { - throw new SyntaxError(sprintf('The type "%s" does not exist. Known types are: "%s"', $type, implode('", "', array_keys($types)))); - } - - //Return formatted number - return $formatter->format($number, $types[$type]); - } - - /** - * Format currency - */ - public function currency(int|float $number, string $currency, ?string $locale = null) { - //Get formatter - $formatter = $this->getNumberFormatter($locale, 'currency'); - - //Return formatted currency - return $formatter->formatCurrency($number, $currency); - } - /** * Compute eastern for selected year * @@ -137,7 +112,7 @@ class IntlUtil { static $formatters = []; //Set locale - $locale = null !== $locale ? $locale : Locale::getDefault(); + $locale = null !== $locale ? $locale : \Locale::getDefault(); //With existing formatter if (isset($formatters[$locale][$style])) { @@ -153,7 +128,7 @@ class IntlUtil { 'scientific' => \NumberFormatter::SCIENTIFIC, 'spellout' => \NumberFormatter::SPELLOUT, 'ordinal' => \NumberFormatter::ORDINAL, - 'duration' => \NumberFormatter::DURATION, + 'duration' => \NumberFormatter::DURATION ]; //Without styles @@ -164,4 +139,68 @@ class IntlUtil { //Return number formatter return ($formatters[$locale][$style] = \NumberFormatter::create($locale, $styles[$style])); } + + /** + * Format number + */ + public function number(int|float $number, $style = 'decimal', $type = 'default', ?string $locale = null) { + //Set types + static $types = [ + 'default' => \NumberFormatter::TYPE_DEFAULT, + 'int32' => \NumberFormatter::TYPE_INT32, + 'int64' => \NumberFormatter::TYPE_INT64, + 'double' => \NumberFormatter::TYPE_DOUBLE, + 'currency' => \NumberFormatter::TYPE_CURRENCY + ]; + + //Get formatter + $formatter = $this->getNumberFormatter($locale, $style); + + //Without type + if (!isset($types[$type])) { + throw new SyntaxError(sprintf('The type "%s" does not exist. Known types are: "%s"', $type, implode('", "', array_keys($types)))); + } + + //Return formatted number + return $formatter->format($number, $types[$type]); + } + + /** + * Format size + * + * @TODO: @XXX: add unit translation kB, MB, GiB, etc ? + */ + public function size(int|float $number, $si = true, $style = 'decimal', $type = 'default', ?string $locale = null) { + //Set types + static $types = [ + 'default' => \NumberFormatter::TYPE_DEFAULT, + 'int32' => \NumberFormatter::TYPE_INT32, + 'int64' => \NumberFormatter::TYPE_INT64, + 'double' => \NumberFormatter::TYPE_DOUBLE, + 'currency' => \NumberFormatter::TYPE_CURRENCY + ]; + + //Get formatter + $formatter = $this->getNumberFormatter($locale, $style); + + //Without type + if (!isset($types[$type])) { + throw new SyntaxError(sprintf('The type "%s" does not exist. Known types are: "%s"', $type, implode('", "', array_keys($types)))); + } + + //Set unit + $unit = $si ? 1000 : 1024; + + //Set index + $index = [ '', $si ? 'k' : 'K', 'M', 'G', 'T', 'P', 'E' ]; + + //Get exp + $exp = intval((log($number) / log($unit))); + + //Rebase number + $number = round($number / pow($unit, $exp), 2); + + //Return formatted number + return $formatter->format($number, $types[$type]).' '.$index[$exp].($si ? '' : 'i').'B'; + } }