Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
9 / 9
CRAP
97.59% covered (success)
97.59%
81 / 83
BcMath
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
9 / 9
47
100.00% covered (success)
100.00%
81 / 81
 bcscale
100.00% covered (success)
100.00%
1 / 1
4
100.00% covered (success)
100.00%
5 / 5
 bcmulArray
100.00% covered (success)
100.00%
1 / 1
4
100.00% covered (success)
100.00%
8 / 8
 bcdivArray
100.00% covered (success)
100.00%
1 / 1
6
100.00% covered (success)
100.00%
11 / 11
 bcaddArray
100.00% covered (success)
100.00%
1 / 1
5
100.00% covered (success)
100.00%
9 / 9
 bcsubArray
100.00% covered (success)
100.00%
1 / 1
5
100.00% covered (success)
100.00%
9 / 9
 bcmaxArray
100.00% covered (success)
100.00%
1 / 1
5
100.00% covered (success)
100.00%
9 / 9
 bcminArray
100.00% covered (success)
100.00%
1 / 1
5
100.00% covered (success)
100.00%
9 / 9
 bcformat
100.00% covered (success)
100.00%
1 / 1
8
100.00% covered (success)
100.00%
16 / 16
 bcround
100.00% covered (success)
100.00%
1 / 1
5
100.00% covered (success)
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');
}