X-Git-Url: https://git.rapsys.eu/packbundle/blobdiff_plain/5324c74e736bc74c7e05cc8740c1971ff82e3306..1dca397fd4da988e8a9851f29ffcf808696a9b4f:/Util/IntlUtil.php diff --git a/Util/IntlUtil.php b/Util/IntlUtil.php index 9f897e1..b37169d 100644 --- a/Util/IntlUtil.php +++ b/Util/IntlUtil.php @@ -22,6 +22,7 @@ class IntlUtil { * Format date */ public function date(Environment $env, \DateTime $date, string $dateFormat = 'medium', string $timeFormat = 'medium', ?string $locale = null, \IntlTimeZone|\DateTimeZone|string|null $timezone = null, ?string $calendar = null, ?string $pattern = null) { + //Get converted date $date = twig_date_converter($env, $date, $timezone); //Set date and time formatters @@ -33,6 +34,7 @@ class IntlUtil { 'full' => \IntlDateFormatter::FULL, ]; + //Get formatter $formatter = \IntlDateFormatter::create( $locale, $formatters[$dateFormat], @@ -42,6 +44,7 @@ class IntlUtil { $pattern ); + //Return formatted date return $formatter->format($date->getTimestamp()); } @@ -49,32 +52,78 @@ class IntlUtil { * Format number */ public function number(int|float $number, $style = 'decimal', $type = 'default', ?string $locale = null) { - static $typeValues = array( + //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); - if (!isset($typeValues[$type])) { - throw new SyntaxError(sprintf('The type "%s" does not exist. Known types are: "%s"', $type, implode('", "', array_keys($typeValues)))); + //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 $formatter->format($number, $typeValues[$type]); + //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 + * + * @param string $year The eastern year + * + * @return DateTime The eastern date + */ + public function getEastern(string $year): \DateTime { + //Set static results + static $results = []; + + //Check if already computed + if (isset($results[$year])) { + //Return computed eastern + return $results[$year]; + } + + $d = (19 * ($year % 19) + 24) % 30; + + $e = (2 * ($year % 4) + 4 * ($year % 7) + 6 * $d + 5) % 7; + + $day = 22 + $d + $e; + + $month = 3; + + if ($day > 31) { + $day = $d + $e - 9; + $month = 4; + } elseif ($d == 29 && $e == 6) { + $day = 10; + $month = 4; + } elseif ($d == 28 && $e == 6) { + $day = 18; + $month = 4; + } + + //Store eastern in data + return ($results[$year] = new \DateTime(sprintf('%04d-%02d-%02d', $year, $month, $day))); + } + /** * Gets number formatter instance matching locale and style. *