132 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * @package         Advanced Custom Fields
 | |
|  * @version         2.8.8 Pro
 | |
|  *
 | |
|  * @author          Tassos Marinos <info@tassos.gr>
 | |
|  * @link            http://www.tassos.gr
 | |
|  * @copyright       Copyright © 2024 Tassos Marinos All Rights Reserved
 | |
|  * @license         GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
 | |
|  */
 | |
| 
 | |
| defined('_JEXEC') or die;
 | |
| 
 | |
| if (!function_exists('bcadd'))
 | |
| {
 | |
| 	function bcadd($Num1,$Num2,$Scale=null)
 | |
| 	{
 | |
| 		// check if they're valid positive numbers, extract the whole numbers and decimals
 | |
| 		if(!preg_match("/^\+?(\d+)(\.\d+)?$/",$Num1,$Tmp1)||
 | |
| 			!preg_match("/^\+?(\d+)(\.\d+)?$/",$Num2,$Tmp2)) return('0');
 | |
| 
 | |
| 		// this is where the result is stored
 | |
| 		$Output=array();
 | |
| 
 | |
| 		// remove ending zeroes from decimals and remove point
 | |
| 		$Dec1=isset($Tmp1[2])?rtrim(substr($Tmp1[2],1),'0'):'';
 | |
| 		$Dec2=isset($Tmp2[2])?rtrim(substr($Tmp2[2],1),'0'):'';
 | |
| 
 | |
| 		// calculate the longest length of decimals
 | |
| 		$DLen=max(strlen($Dec1),strlen($Dec2));
 | |
| 
 | |
| 		// if $Scale is null, automatically set it to the amount of decimal places for accuracy
 | |
| 		if($Scale==null) $Scale=$DLen;
 | |
| 
 | |
| 		// remove leading zeroes and reverse the whole numbers, then append padded decimals on the end
 | |
| 		$Num1=strrev(ltrim($Tmp1[1],'0').str_pad($Dec1,$DLen,'0'));
 | |
| 		$Num2=strrev(ltrim($Tmp2[1],'0').str_pad($Dec2,$DLen,'0'));
 | |
| 
 | |
| 		// calculate the longest length we need to process
 | |
| 		$MLen=max(strlen($Num1),strlen($Num2));
 | |
| 
 | |
| 		// pad the two numbers so they are of equal length (both equal to $MLen)
 | |
| 		$Num1=str_pad($Num1,$MLen,'0');
 | |
| 		$Num2=str_pad($Num2,$MLen,'0');
 | |
| 
 | |
| 		// process each digit, keep the ones, carry the tens (remainders)
 | |
| 		for($i=0;$i<$MLen;$i++) {
 | |
| 			$Sum=((int)$Num1[$i]+(int)$Num2[$i]);
 | |
| 			if(isset($Output[$i])) $Sum+=$Output[$i];
 | |
| 			$Output[$i]=$Sum%10;
 | |
| 			if($Sum>9) $Output[$i+1]=1;
 | |
| 		}
 | |
| 
 | |
| 		// convert the array to string and reverse it
 | |
| 		$Output=strrev(implode($Output));
 | |
| 
 | |
| 		// substring the decimal digits from the result, pad if necessary (if $Scale > amount of actual decimals)
 | |
| 		// next, since actual zero values can cause a problem with the substring values, if so, just simply give '0'
 | |
| 		// next, append the decimal value, if $Scale is defined, and return result
 | |
| 		$Decimal=str_pad(substr($Output,-$DLen,$Scale),$Scale,'0');
 | |
| 		$Output=(($MLen-$DLen<1)?'0':substr($Output,0,-$DLen));
 | |
| 		$Output.=(($Scale>0)?".{$Decimal}":'');
 | |
| 		return($Output);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| if (!function_exists('bcmul'))
 | |
| {
 | |
| 	function bcmul($Num1='0',$Num2='0') {
 | |
| 		// check if they're both plain numbers
 | |
| 		if(!preg_match("/^\d+$/",$Num1)||!preg_match("/^\d+$/",$Num2)) return(0);
 | |
| 
 | |
| 		// remove zeroes from beginning of numbers
 | |
| 		for($i=0;$i<strlen($Num1);$i++) if(@$Num1[$i]!='0') {$Num1=substr($Num1,$i);break;}
 | |
| 		for($i=0;$i<strlen($Num2);$i++) if(@$Num2[$i]!='0') {$Num2=substr($Num2,$i);break;}
 | |
| 
 | |
| 		// get both number lengths
 | |
| 		$Len1=strlen($Num1);
 | |
| 		$Len2=strlen($Num2);
 | |
| 
 | |
| 		// $Rema is for storing the calculated numbers and $Rema2 is for carrying the remainders
 | |
| 		$Rema=$Rema2=array();
 | |
| 
 | |
| 		// we start by making a $Len1 by $Len2 table (array)
 | |
| 		for($y=$i=0;$y<$Len1;$y++)
 | |
| 			for($x=0;$x<$Len2;$x++)
 | |
| 				// we use the classic lattice method for calculating the multiplication..
 | |
| 				// this will multiply each number in $Num1 with each number in $Num2 and store it accordingly
 | |
| 				@$Rema[$i++%$Len2].=sprintf('%02d',(int)$Num1[$y]*(int)$Num2[$x]);
 | |
| 
 | |
| 		// cycle through each stored number
 | |
| 		for($y=0;$y<$Len2;$y++)
 | |
| 			for($x=0;$x<$Len1*2;$x++)
 | |
| 				// add up the numbers in the diagonal fashion the lattice method uses
 | |
| 				@$Rema2[Floor(($x-1)/2)+1+$y]+=(int)$Rema[$y][$x];
 | |
| 
 | |
| 		// reverse the results around
 | |
| 		$Rema2=array_reverse($Rema2);
 | |
| 
 | |
| 		// cycle through all the results again
 | |
| 		for($i=0;$i<count($Rema2);$i++) {
 | |
| 			// reverse this item, split, keep the first digit, spread the other digits down the array
 | |
| 			$Rema3=str_split(strrev($Rema2[$i]));
 | |
| 			for($o=0;$o<count($Rema3);$o++)
 | |
| 				if($o==0) @$Rema2[$i+$o]=$Rema3[$o];
 | |
| 				else @$Rema2[$i+$o]+=$Rema3[$o];
 | |
| 		}
 | |
| 		// implode $Rema2 so it's a string and reverse it, this is the result!
 | |
| 		$Rema2=strrev(implode($Rema2));
 | |
| 
 | |
| 		// just to make sure, we delete the zeros from the beginning of the result and return
 | |
| 		while(strlen($Rema2)>1&&$Rema2[0]=='0') $Rema2=substr($Rema2,1);
 | |
| 
 | |
| 		return($Rema2);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| if (!function_exists('bcpow'))
 | |
| {
 | |
| 	function bcpow($num, $power)
 | |
| 	{
 | |
| 		$answer = "1";
 | |
| 
 | |
| 		while ($power)
 | |
| 		{
 | |
| 			$answer = bcmul($answer, $num, 100);
 | |
| 			$power--;
 | |
| 		}
 | |
| 		return rtrim($answer, '0.');
 | |
| 	}
 | |
| } |