diff --git a/Tests/convertTest.php b/Tests/convertTest.php index d1e6bfd..b4bd8c9 100644 --- a/Tests/convertTest.php +++ b/Tests/convertTest.php @@ -56,4 +56,80 @@ class test_convert extends PHPUnit_Framework_TestCase $res = \convert::ucwords ("édou-ard d'étienne", " -'"); $this->assertSame ($res, "Édou-Ard D'Étienne"); } + + ///////////////////// + // humanSize // + ///////////////////// + public function test_humanSize_1 () + { + $res = ""; + for ($i = -8 ; $i <= 8 ; $i++) + { + $res .= \convert::humanSize (1.441234 * pow (1000, $i), 2, 1000)."\n"; + } + $this->assertSame ($res, "1.44yB\n1.44zB\n1.44aB\n1.44fB\n1.44pB\n1.44nB\n". + "1.44uB\n1.44mB\n1.44B\n1.44kB\n1.44MB\n1.44GB\n1.44TB\n1.44PB\n1.44EB\n". + "1.44ZB\n1.44YB\n"); + } + + public function test_humanSize_2 () + { + $res = \convert::humanSize (1441234); + $this->assertSame ($res, "1.44MB"); + } + public function test_humanSize_3 () + { + $res = \convert::humanSize (10441234); + $this->assertSame ($res, "10.44MB"); + } + public function test_humanSize_4 () + { + $res = \convert::humanSize (0.123, 0); + $this->assertSame ($res, "123mB"); + } + public function test_humanSize_5 () + { + $res = \convert::humanSize (0.12345, 2); + $this->assertSame ($res, "123.45mB"); + } + + public function test_humanSize_6 () + { + $res = \convert::humanSize (-0.12345, 2); + $this->assertSame ($res, "-123.45mB"); + } + + public function test_humanSize_7 () + { + $res = \convert::humanSize (-12345, 2); + $this->assertSame ($res, "-12.35kB"); + } + + public function test_humanSize_error1 () + { + $this->expectException ("Exception", + "convert::humanSize value not numerical : string", 500); + $res = \convert::humanSize ("1441234"); + } + + public function test_humanSize_error2 () + { + $this->expectException ("Exception", + "convert::humanSize decimal not integer : double", 500); + $res = \convert::humanSize (1441234, 0.1); + } + + public function test_humanSize_error3 () + { + $this->expectException ("Exception", + "convert::humanSize decimal value negative", 500); + $res = \convert::humanSize (1441234, -1); + } + + public function test_humanSize_error4 () + { + $this->expectException ("Exception", + "convert::humanSize power value !== 1000 and 1024 : 2000", 500); + $res = \convert::humanSize (1441234, 2, 2000); + } } diff --git a/convert.php b/convert.php index 3ccd058..c013208 100644 --- a/convert.php +++ b/convert.php @@ -84,28 +84,58 @@ class convert return $res; } - /** Convert the provided integer to human readable format - * Example : 1440000000 => 1.44Mo - * @param integer $bytes The number of bytes to convert - * @param integer $decimals The number of decimal + /** Convert the provided float to human readable format + * Example : 1440000 => 1.44MB + * @param float|integer $value The number to convert + * @param integer|null $decimals The number of decimal (2 by default) + * @param integer|null $power (1000 by default or 1024) + * @param string|null $unit The Unit displayed after the multiplier (B for + * Bytes by default) */ - public static function humanSize ($bytes, $decimals = 2) + public static function humanSize ($value, $decimals = 2, $power = 1000, + $unit = "B") { - $size = array (dgettext ("domframework", 'B'), - dgettext ("domframework", 'kB'), - dgettext ("domframework", 'MB'), - dgettext ("domframework", 'GB'), - dgettext ("domframework", 'TB'), - dgettext ("domframework", 'PB'), - dgettext ("domframework", 'EB'), - dgettext ("domframework", 'ZB'), - dgettext ("domframework", 'YB')); - $factor = floor ((strlen ($bytes) - 1) / 3); - if ($factor == 0) - $val = sprintf ("%d", intval ($bytes)). @$size[$factor]; + if (! is_integer ($value) && ! is_float ($value)) + throw new \Exception ("convert::humanSize value not numerical : ". + gettype ($value), 500); + if (! is_integer ($decimals)) + throw new \Exception ("convert::humanSize decimal not integer : ". + gettype ($decimals), 500); + if ($decimals < 0) + throw new \Exception ("convert::humanSize decimal value negative", 500); + if ($power !== 1000 && $power !== 1024) + throw new \Exception ("convert::humanSize power value !== 1000 and 1024". + " : ".var_export ($power, true), 500); + $size = array ( + -8 => 'y', // yocto + -7 => 'z', // zepto + -6 => 'a', // atto + -5 => 'f', // femto + -4 => 'p', // pico + -3 => 'n', // nano + -2 => 'u', // micro + -1 => 'm', // milli + 0 => '', + 1 => 'k', // kilo + 2 => 'M', // mega + 3 => 'G', // giga + 4 => 'T', // tera + 5 => 'P', // peta + 6 => 'E', // exa + 7 => 'Z', // zetta + 8 => 'Y');// yotta + for ($factor = 8 ; $factor >= -8 ; $factor--) + { + if (abs ($value) >= pow ($power, $factor)) + break; + } + if ($factor > 0) + $display = $value / pow ($power, $factor); + elseif ($factor < 0) + $display = $value * pow ($power, -1 * $factor); else - $val = sprintf ("%.{$decimals}f", $bytes / pow (1024, $factor)) . - @$size[$factor]; - return $val; + $display = $value; + + return sprintf ("%.${decimals}f", $display).$size[$factor].$unit; } }