Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/modules/main/lib/grid/row/assembler/field/
Upload File :
Current File : /var/www/homesaver/www/bitrix/modules/main/lib/grid/row/assembler/field/numberfieldassembler.php

<?php

namespace Bitrix\Main\Grid\Row\Assembler\Field;

use Bitrix\Main\Context;
use Bitrix\Main\Context\Culture;
use Bitrix\Main\Grid\Row\FieldAssembler;
use Bitrix\Main\Grid\Settings;

/**
 * Assembler of number fields.
 *
 * Example of creation for an integer:
 * ```php
 * $assembler = new NumberFieldAssembler(false, ['ID', 'COUNT']);
 * ```
 *
 * Example of creation for an float:
 * ```php
 * $assembler = new NumberFieldAssembler(true, ['WEIGHT', 'AMOUNT']);
 * ```
 *
 * Example of creation for culture of current context:
 * ```php
 * $assembler = NumberFieldAssembler::createForContext(true, ['COUNT', 'AMOUNT']);
 * ```
 *
 * @see \Bitrix\Main\Context
 * @see \Bitrix\Main\Context\Culture
 */
class NumberFieldAssembler extends FieldAssembler
{
	private bool $isFloat;
	private ?Culture $culture;

	/**
	 * @param bool $isFloat
	 * @param array $columnIds
	 * @param Settings|null $settings
	 * @param Culture|null $culture
	 */
	public function __construct(bool $isFloat, array $columnIds, ?Settings $settings = null, ?Culture $culture = null)
	{
		$this->isFloat = $isFloat;
		$this->culture = $culture;

		parent::__construct($columnIds, $settings);
	}

	/**
	 * Create assembler for culture of context.
	 *
	 * @param bool $isFloat
	 * @param array $columnIds
	 * @param Settings|null $settings
	 * @param Context|null $context if is null - use is current context.
	 *
	 * @return self
	 */
	public static function createForContext(bool $isFloat, array $columnIds, ?Settings $settings = null, Context $context = null): self
	{
		$context ??= Context::getCurrent();

		return new static(
			$isFloat,
			$columnIds,
			$settings,
			$context?->getCulture()
		);
	}

	/**
	 * @inheritDoc
	 *
	 * @param mixed $value
	 *
	 * @return string|int|float|null returns formatted string if sets culture. If the value is not a number, then 0 is returned.
	 */
	protected function prepareColumn($value): string|int|float|null
	{
		if (is_null($value))
		{
			return null;
		}
		elseif (!is_numeric($value))
		{
			return $this->isFloat ? 0.0 : 0;
		}

		if ($this->isFloat)
		{
			$value = (float)$value;
		}
		else
		{
			$value = (int)$value;
		}

		if (isset($this->culture))
		{
			return number_format(
				$value,
				$this->culture->getNumberDecimals(),
				$this->culture->getNumberDecimalSeparator(),
				$this->culture->getNumberThousandsSeparator(),
			);
		}

		return $value;
	}
}