Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
100.00% |
1 / 1 |
|
100.00% |
9 / 9 |
CRAP | |
97.59% |
81 / 83 |
| BcMath | |
100.00% |
1 / 1 |
|
100.00% |
9 / 9 |
47 | |
100.00% |
81 / 81 |
| bcscale | |
100.00% |
1 / 1 |
4 | |
100.00% |
5 / 5 |
|||
| bcmulArray | |
100.00% |
1 / 1 |
4 | |
100.00% |
8 / 8 |
|||
| bcdivArray | |
100.00% |
1 / 1 |
6 | |
100.00% |
11 / 11 |
|||
| bcaddArray | |
100.00% |
1 / 1 |
5 | |
100.00% |
9 / 9 |
|||
| bcsubArray | |
100.00% |
1 / 1 |
5 | |
100.00% |
9 / 9 |
|||
| bcmaxArray | |
100.00% |
1 / 1 |
5 | |
100.00% |
9 / 9 |
|||
| bcminArray | |
100.00% |
1 / 1 |
5 | |
100.00% |
9 / 9 |
|||
| bcformat | |
100.00% |
1 / 1 |
8 | |
100.00% |
16 / 16 |
|||
| bcround | |
100.00% |
1 / 1 |
5 | |
100.00% |
5 / 5 |
|||
| <?php | |
| namespace ia\Math; | |
| /** | |
| * BcMath extra function and shim | |
| * version 1.0.2 | |
| * | |
| */ | |
| class BcMath { | |
| protected static $scale = 2; | |
| public static function bcscale($scale) { | |
| if(is_numeric($scale) && $scale !== '' && $scale !== null) { | |
| self::$scale = $scale; | |
| bcscale($scale); | |
| return true; | |
| } | |
| return false; | |
| } | |
| /** | |
| * Multiply all elements from the array | |
| * | |
| * @param array $arr numbers to multiply | |
| * @param int $scale number of decimals to use | |
| * @return string result of multiplying all elements of $arr | |
| */ | |
| public static function bcmulArray($arr, $scale = null) { | |
| if(empty($arr)) { | |
| return null; | |
| } | |
| if($scale === null) { | |
| $scale = self::$scale; | |
| } | |
| $result = 1; | |
| foreach($arr as $n) { | |
| $result = bcmul($result, $n, $scale); | |
| } | |
| return $result; | |
| } | |
| /** | |
| * Divide all elements from the array | |
| * | |
| * @param array $arr numbers to divide | |
| * @param int $scale number of decimals to use | |
| * @return string result of dividing all elements of $arr ($arr[0]/$arr[1]/...) | |
| */ | |
| public static function bcdivArray($arr, $scale = null) { | |
| if(empty($arr)) { | |
| return null; | |
| } | |
| if($scale === null) { | |
| $scale = self::$scale; | |
| } | |
| foreach($arr as $n) { | |
| if(!isset($result)) { | |
| $result = $n; | |
| } else { | |
| if( bccomp("0", $n, 14) === 0 ) { | |
| return null; | |
| } | |
| $result = bcdiv($result, $n, $scale); | |
| } | |
| } | |
| /** @noinspection PhpUndefinedVariableInspection */ | |
| return $result; | |
| } | |
| /** | |
| * Add all elements from the array | |
| * | |
| * @param array $arr numbers to add | |
| * @param int $scale number of decimals to use | |
| * @return string result of adding all elements of $arr | |
| */ | |
| public static function bcaddArray($arr, $scale = null) { | |
| if(empty($arr)) { | |
| return null; | |
| } | |
| if($scale === null) { | |
| $scale = self::$scale; | |
| } | |
| foreach($arr as $n) { | |
| if(!isset($result)) { | |
| $result = $n; | |
| } else { | |
| $result = bcadd($result, $n, $scale); | |
| } | |
| } | |
| /** @noinspection PhpUndefinedVariableInspection */ | |
| return $result; | |
| } | |
| /** | |
| * Substract all elements from the array | |
| * | |
| * @param array $arr numbers to substract | |
| * @param int $scale number of decimals to use | |
| * @return string result of substracting all elements of $arr | |
| */ | |
| public static function bcsubArray($arr, $scale = null) { | |
| if(empty($arr)) { | |
| return null; | |
| } | |
| if($scale === null) { | |
| $scale = self::$scale; | |
| } | |
| foreach($arr as $n) { | |
| if(!isset($result)) { | |
| $result = $n; | |
| } else { | |
| $result = bcsub($result, $n, $scale); | |
| } | |
| } | |
| /** @noinspection PhpUndefinedVariableInspection */ | |
| return $result; | |
| } | |
| /** | |
| * Get maximum value from array | |
| * | |
| * @param array $arr numbers to obtain maximum from | |
| * @param int $scale number of decimals to use | |
| * @return string maximum value of $arr | |
| */ | |
| public static function bcmaxArray($arr, $scale = null) { | |
| if(empty($arr)) { | |
| return null; | |
| } | |
| if($scale === null) { | |
| $scale = self::$scale; | |
| } | |
| $max = reset($arr); | |
| foreach($arr as $n) { | |
| if(bccomp( $n , $max, $scale) === 1) { | |
| $max = $n; | |
| } | |
| } | |
| return bcadd("0", $max, $scale); | |
| } | |
| /** | |
| * Get minimum value from array | |
| * | |
| * @param array $arr numbers to obtain minimum from | |
| * @param int $scale number of decimals to use | |
| * @return string minimum value of $arr | |
| */ | |
| public static function bcminArray($arr, $scale = null) { | |
| if(empty($arr)) { | |
| return null; | |
| } | |
| if($scale === null) { | |
| $scale = self::$scale; | |
| } | |
| $min = reset($arr); | |
| foreach($arr as $n) { | |
| if(bccomp( $min , $n, $scale) === 1) { | |
| $min = $n; | |
| } | |
| } | |
| return bcadd("0", $min, $scale); | |
| } | |
| public static function bcformat($number, $decimals = 2, $dec_point = '.', $thousandsSep = ',') { | |
| if($number === null) { | |
| return null; | |
| } | |
| if(!is_numeric($number)) { return $number; } | |
| if($decimals === null) {$decimals = self::$scale; } | |
| $n = self::bcround($number, $decimals); | |
| $ret = []; | |
| $commaCount = 0; | |
| $numParts = explode('.', $n); | |
| $integral = $numParts[0]; | |
| for($i = strlen($integral)-1; $i>=0; $i--) { | |
| if ($commaCount++ % 3 === 0 && $commaCount >1) { | |
| $ret[] = $thousandsSep; | |
| } | |
| $ret[] = $integral[$i]; | |
| } | |
| if($decimals === 0) { | |
| return implode(array_reverse($ret), ''); | |
| } | |
| return implode( array_reverse($ret) , '').$dec_point.$numParts[1]; | |
| } | |
| public static function bcround($number, $precision = null) { | |
| if($number === null) { | |
| return null; | |
| } | |
| if(bccomp('0', $number) <= 0) { | |
| return bcadd($number, '0.'. str_repeat('0', $precision).'5', $precision === null ? self::$scale : $precision); | |
| } | |
| return bcsub($number, '0.'. str_repeat('0', $precision).'5', $precision === null ? self::$scale : $precision); | |
| /* | |
| * @TODO some php version dont return .00 | |
| if (strpos($number,'.') === FALSE) { | |
| if($precision == 0) { | |
| return $number; | |
| } | |
| return $number . '.' . str_repeat('0', $precision); | |
| } | |
| if ($number[0] === '-') { | |
| return bcsub($number, '0.' . str_repeat('0', $precision) . '5', $precision); | |
| } | |
| return bcadd($number, '0.' . str_repeat('0', $precision) . '5', $precision); | |
| */ | |
| } | |
| } | |
| if(!extension_loaded("bcmath")) { | |
| require_once(__DIR__ . 'BcMathShim.php'); | |
| } |