# tablepress/3.4/libraries/vendor/PhpSpreadsheet/Calculation/BinaryComparison.php

TablePress – Tables in WordPress made easy, version 3.4. 191 lines.

- Page: https://pluginprobe.com/plugins/tablepress/3.4/code/libraries/vendor/PhpSpreadsheet/Calculation/BinaryComparison.php
- Raw: https://pluginprobe.com/plugins/tablepress/3.4/raw/libraries/vendor/PhpSpreadsheet/Calculation/BinaryComparison.php
- Modified: 2026-02-17T04:58:24+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/tablepress/3.4/code/libraries/vendor/PhpSpreadsheet/Calculation/BinaryComparison.php#L10-L20`.

```php
<?php

namespace TablePress\PhpOffice\PhpSpreadsheet\Calculation;

use TablePress\PhpOffice\PhpSpreadsheet\Calculation\Information\ErrorValue;
use TablePress\PhpOffice\PhpSpreadsheet\Shared\StringHelper;

class BinaryComparison
{
	/**
	 * Epsilon Precision used for comparisons in calculations.
	 */
	private const DELTA = 0.1e-12;

	/**
	 * Compare two strings in the same way as strcmp() except that lowercase come before uppercase letters.
	 *
	 * @param mixed $str1 First string value for the comparison, expect ?string
	 * @param mixed $str2 Second string value for the comparison, expect ?string
	 */
	private static function strcmpLowercaseFirst($str1, $str2): int
	{
		$str1 = StringHelper::convertToString($str1);
		$str2 = StringHelper::convertToString($str2);
		$inversedStr1 = StringHelper::strCaseReverse($str1);
		$inversedStr2 = StringHelper::strCaseReverse($str2);

		return strcmp($inversedStr1, $inversedStr2);
	}

	/**
	 * PHP8.1 deprecates passing null to strcmp.
	 *
	 * @param mixed $str1 First string value for the comparison, expect ?string
	 * @param mixed $str2 Second string value for the comparison, expect ?string
	 */
	private static function strcmpAllowNull($str1, $str2): int
	{
		$str1 = StringHelper::convertToString($str1);
		$str2 = StringHelper::convertToString($str2);

		return strcmp($str1, $str2);
	}

	/**
				 * @return bool|string
				 * @param mixed $operand1
				 * @param mixed $operand2
				 */
				public static function compare($operand1, $operand2, string $operator)
	{
		//    Simple validate the two operands if they are string values
		if (is_string($operand1) && $operand1 > '' && $operand1[0] == Calculation::FORMULA_STRING_QUOTE) {
			$operand1 = Calculation::unwrapResult($operand1);
		}
		if (ErrorValue::isError($operand1, true)) {
			/** @var string $operand1 */
			return $operand1;
		}
		if (is_string($operand2) && $operand2 > '' && $operand2[0] == Calculation::FORMULA_STRING_QUOTE) {
			$operand2 = Calculation::unwrapResult($operand2);
		}
		if (ErrorValue::isError($operand2, true)) {
			/** @var string $operand2 */
			return $operand2;
		}

		// Use case-insensitive comparison if not OpenOffice mode
		if (Functions::getCompatibilityMode() != Functions::COMPATIBILITY_OPENOFFICE) {
			if (is_string($operand1)) {
				$operand1 = StringHelper::strToUpper($operand1);
			}
			if (is_string($operand2)) {
				$operand2 = StringHelper::strToUpper($operand2);
			}
		}

		$useLowercaseFirstComparison = is_string($operand1)
			&& is_string($operand2)
			&& Functions::getCompatibilityMode() === Functions::COMPATIBILITY_OPENOFFICE;

		return self::evaluateComparison($operand1, $operand2, $operator, $useLowercaseFirstComparison);
	}

	/**
				 * @param mixed $operand1
				 * @param mixed $operand2
				 */
				private static function evaluateComparison($operand1, $operand2, string $operator, bool $useLowercaseFirstComparison): bool
	{
		switch ($operator) {
									case '=':
										return self::equal($operand1, $operand2);
									case '>':
										return self::greaterThan($operand1, $operand2, $useLowercaseFirstComparison);
									case '<':
										return self::lessThan($operand1, $operand2, $useLowercaseFirstComparison);
									case '>=':
										return self::greaterThanOrEqual($operand1, $operand2, $useLowercaseFirstComparison);
									case '<=':
										return self::lessThanOrEqual($operand1, $operand2, $useLowercaseFirstComparison);
									case '<>':
										return self::notEqual($operand1, $operand2);
									default:
										throw new Exception('Unsupported binary comparison operator');
								}
	}

	/**
				 * @param mixed $operand1
				 * @param mixed $operand2
				 */
				private static function equal($operand1, $operand2): bool
	{
		if (is_numeric($operand1) && is_numeric($operand2)) {
			$result = (abs($operand1 - $operand2) < self::DELTA);
		} elseif (($operand1 === null && is_numeric($operand2)) || ($operand2 === null && is_numeric($operand1))) {
			$result = $operand1 == $operand2;
		} else {
			$result = self::strcmpAllowNull($operand1, $operand2) == 0;
		}

		return $result;
	}

	/**
				 * @param mixed $operand1
				 * @param mixed $operand2
				 */
				private static function greaterThanOrEqual($operand1, $operand2, bool $useLowercaseFirstComparison): bool
	{
		if (is_numeric($operand1) && is_numeric($operand2)) {
			$result = ((abs($operand1 - $operand2) < self::DELTA) || ($operand1 > $operand2));
		} elseif (($operand1 === null && is_numeric($operand2)) || ($operand2 === null && is_numeric($operand1))) {
			$result = $operand1 >= $operand2;
		} elseif ($useLowercaseFirstComparison) {
			$result = self::strcmpLowercaseFirst($operand1, $operand2) >= 0;
		} else {
			$result = self::strcmpAllowNull($operand1, $operand2) >= 0;
		}

		return $result;
	}

	/**
				 * @param mixed $operand1
				 * @param mixed $operand2
				 */
				private static function lessThanOrEqual($operand1, $operand2, bool $useLowercaseFirstComparison): bool
	{
		if (is_numeric($operand1) && is_numeric($operand2)) {
			$result = ((abs($operand1 - $operand2) < self::DELTA) || ($operand1 < $operand2));
		} elseif (($operand1 === null && is_numeric($operand2)) || ($operand2 === null && is_numeric($operand1))) {
			$result = $operand1 <= $operand2;
		} elseif ($useLowercaseFirstComparison) {
			$result = self::strcmpLowercaseFirst($operand1, $operand2) <= 0;
		} else {
			$result = self::strcmpAllowNull($operand1, $operand2) <= 0;
		}

		return $result;
	}

	/**
				 * @param mixed $operand1
				 * @param mixed $operand2
				 */
				private static function greaterThan($operand1, $operand2, bool $useLowercaseFirstComparison): bool
	{
		return self::lessThanOrEqual($operand1, $operand2, $useLowercaseFirstComparison) !== true;
	}

	/**
				 * @param mixed $operand1
				 * @param mixed $operand2
				 */
				private static function lessThan($operand1, $operand2, bool $useLowercaseFirstComparison): bool
	{
		return self::greaterThanOrEqual($operand1, $operand2, $useLowercaseFirstComparison) !== true;
	}

	/**
				 * @param mixed $operand1
				 * @param mixed $operand2
				 */
				private static function notEqual($operand1, $operand2): bool
	{
		return self::equal($operand1, $operand2) !== true;
	}
}

```
