php port * @author Richard Clamp perl version * @copyright 2004-2005 Fabien Potencier * @copyright 2002 Richard Clamp * @license see the LICENSE file included in the distribution * @version SVN: $Id: pakeNumberCompare.class.php 1791 2006-08-23 21:17:06Z fabien $ */ if (class_exists('pakeNumberCompare')) { return; } /** * * Numeric comparisons. * * sfNumberCompare compiles a simple comparison to an anonymous * subroutine, which you can call with a value to be tested again. * Now this would be very pointless, if sfNumberCompare didn't understand * magnitudes. * The target value may use magnitudes of kilobytes (C, C), * megabytes (C, C), or gigabytes (C, C). Those suffixed * with an C use the appropriate 2**n version in accordance with the * IEC standard: http://physics.nist.gov/cuu/Units/binary.html * * based on perl Number::Compare module. * * @package pake * @author Fabien Potencier php port * @author Richard Clamp perl version * @copyright 2004-2005 Fabien Potencier * @copyright 2002 Richard Clamp * @see http://physics.nist.gov/cuu/Units/binary.html * @license see the LICENSE file included in the distribution * @version SVN: $Id: pakeNumberCompare.class.php 1791 2006-08-23 21:17:06Z fabien $ */ class pakeNumberCompare { private $test = ''; public function __construct($test) { $this->test = $test; } public function test($number) { if (!preg_match('{^([<>]=?)?(.*?)([kmg]i?)?$}i', $this->test, $matches)) { throw new pakeException(sprintf('Don\'t understand "%s" as a test.', $this->test)); } $target = array_key_exists(2, $matches) ? $matches[2] : ''; $magnitude = array_key_exists(3, $matches) ? $matches[3] : ''; if (strtolower($magnitude) == 'k') $target *= 1000; if (strtolower($magnitude) == 'ki') $target *= 1024; if (strtolower($magnitude) == 'm') $target *= 1000000; if (strtolower($magnitude) == 'mi') $target *= 1024*1024; if (strtolower($magnitude) == 'g') $target *= 1000000000; if (strtolower($magnitude) == 'gi') $target *= 1024*1024*1024; $comparison = array_key_exists(1, $matches) ? $matches[1] : '=='; if ($comparison == '==' || $comparison == '') { return ($number == $target); } else if ($comparison == '>') { return ($number > $target); } else if ($comparison == '>=') { return ($number >= $target); } else if ($comparison == '<') { return ($number < $target); } else if ($comparison == '<=') { return ($number <= $target); } return false; } } /* =head1 SYNOPSIS Number::Compare->new(">1Ki")->test(1025); # is 1025 > 1024 my $c = Number::Compare->new(">1M"); $c->(1_200_000); # slightly terser invocation =head1 DESCRIPTION =head1 METHODS =head2 ->new( $test ) Returns a new object that compares the specified test. =head2 ->test( $value ) A longhanded version of $compare->( $value ). Predates blessed subroutine reference implementation. =head2 ->parse_to_perl( $test ) Returns a perl code fragment equivalent to the test. */