| 
									
										
										
										
											2015-05-17 16:10:35 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-31 17:18:12 +00:00
										 |  |  | namespace PhpOffice\PhpSpreadsheetTests\Custom; | 
					
						
							| 
									
										
										
										
											2016-05-18 07:02:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-31 17:18:12 +00:00
										 |  |  | use PhpOffice\PhpSpreadsheet\Exception; | 
					
						
							| 
									
										
										
										
											2016-08-14 04:08:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-17 16:10:35 +00:00
										 |  |  | class Complex | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     private $realPart = 0; | 
					
						
							|  |  |  |     private $imaginaryPart = 0; | 
					
						
							| 
									
										
										
										
											2017-10-01 11:07:04 +00:00
										 |  |  |     private $suffix; | 
					
						
							| 
									
										
										
										
											2015-05-17 16:10:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public static function _parseComplex($complexNumber) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         //    Test for real number, with no imaginary part
 | 
					
						
							|  |  |  |         if (is_numeric($complexNumber)) { | 
					
						
							| 
									
										
										
										
											2016-08-16 15:33:57 +00:00
										 |  |  |             return [$complexNumber, 0, null]; | 
					
						
							| 
									
										
										
										
											2015-05-17 16:10:35 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         //    Fix silly human errors
 | 
					
						
							|  |  |  |         if (strpos($complexNumber, '+-') !== false) { | 
					
						
							|  |  |  |             $complexNumber = str_replace('+-', '-', $complexNumber); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (strpos($complexNumber, '++') !== false) { | 
					
						
							|  |  |  |             $complexNumber = str_replace('++', '+', $complexNumber); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (strpos($complexNumber, '--') !== false) { | 
					
						
							|  |  |  |             $complexNumber = str_replace('--', '-', $complexNumber); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         //    Basic validation of string, to parse out real and imaginary parts, and any suffix
 | 
					
						
							|  |  |  |         $validComplex = preg_match('/^([\-\+]?(\d+\.?\d*|\d*\.?\d+)([Ee][\-\+]?[0-2]?\d{1,3})?)([\-\+]?(\d+\.?\d*|\d*\.?\d+)([Ee][\-\+]?[0-2]?\d{1,3})?)?(([\-\+]?)([ij]?))$/ui', $complexNumber, $complexParts); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!$validComplex) { | 
					
						
							|  |  |  |             //    Neither real nor imaginary part, so test to see if we actually have a suffix
 | 
					
						
							|  |  |  |             $validComplex = preg_match('/^([\-\+]?)([ij])$/ui', $complexNumber, $complexParts); | 
					
						
							|  |  |  |             if (!$validComplex) { | 
					
						
							| 
									
										
										
										
											2016-08-14 04:08:43 +00:00
										 |  |  |                 throw new Exception('COMPLEX: Invalid complex number'); | 
					
						
							| 
									
										
										
										
											2015-05-17 16:10:35 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |             //    We have a suffix, so set the real to 0, the imaginary to either 1 or -1 (as defined by the sign)
 | 
					
						
							|  |  |  |             $imaginary = 1; | 
					
						
							|  |  |  |             if ($complexParts[1] === '-') { | 
					
						
							|  |  |  |                 $imaginary = 0 - $imaginary; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-08-16 15:33:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             return [0, $imaginary, $complexParts[2]]; | 
					
						
							| 
									
										
										
										
											2015-05-17 16:10:35 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         //    If we don't have an imaginary part, identify whether it should be +1 or -1...
 | 
					
						
							|  |  |  |         if (($complexParts[4] === '') && ($complexParts[9] !== '')) { | 
					
						
							|  |  |  |             if ($complexParts[7] !== $complexParts[9]) { | 
					
						
							|  |  |  |                 $complexParts[4] = 1; | 
					
						
							|  |  |  |                 if ($complexParts[8] === '-') { | 
					
						
							|  |  |  |                     $complexParts[4] = -1; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2017-10-01 11:07:04 +00:00
										 |  |  |                 //    ... or if we have only the real and no imaginary part (in which case our real should be the imaginary)
 | 
					
						
							| 
									
										
										
										
											2015-05-17 16:10:35 +00:00
										 |  |  |             } else { | 
					
						
							|  |  |  |                 $complexParts[4] = $complexParts[1]; | 
					
						
							|  |  |  |                 $complexParts[1] = 0; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         //    Return real and imaginary parts and suffix as an array, and set a default suffix if user input lazily
 | 
					
						
							| 
									
										
										
										
											2016-08-16 15:33:57 +00:00
										 |  |  |         return [$complexParts[1], $complexParts[4], !empty($complexParts[9]) ? $complexParts[9] : 'i']; | 
					
						
							| 
									
										
										
										
											2016-12-22 14:43:37 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     //    function _parseComplex()
 | 
					
						
							| 
									
										
										
										
											2015-05-17 16:10:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public function __construct($realPart, $imaginaryPart = null, $suffix = 'i') | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($imaginaryPart === null) { | 
					
						
							|  |  |  |             if (is_array($realPart)) { | 
					
						
							|  |  |  |                 //    We have an array of (potentially) real and imaginary parts, and any suffix
 | 
					
						
							| 
									
										
										
										
											2017-10-01 12:50:40 +00:00
										 |  |  |                 list($realPart, $imaginaryPart, $suffix) = array_values($realPart) + [0.0, 0.0, 'i']; | 
					
						
							| 
									
										
										
										
											2015-05-17 16:34:30 +00:00
										 |  |  |             } elseif ((is_string($realPart)) || (is_numeric($realPart))) { | 
					
						
							| 
									
										
										
										
											2015-05-17 16:10:35 +00:00
										 |  |  |                 //    We've been given a string to parse to extract the real and imaginary parts, and any suffix
 | 
					
						
							| 
									
										
										
										
											2017-10-01 12:50:40 +00:00
										 |  |  |                 list($realPart, $imaginaryPart, $suffix) = self::_parseComplex($realPart); | 
					
						
							| 
									
										
										
										
											2015-05-17 16:10:35 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         //    Set parsed values in our properties
 | 
					
						
							|  |  |  |         $this->realPart = (float) $realPart; | 
					
						
							|  |  |  |         $this->imaginaryPart = (float) $imaginaryPart; | 
					
						
							|  |  |  |         $this->suffix = strtolower($suffix); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function getReal() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->realPart; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function getImaginary() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->imaginaryPart; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function getSuffix() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->suffix; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-17 16:34:30 +00:00
										 |  |  |     public function __toString() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-08-16 15:33:57 +00:00
										 |  |  |         $str = ''; | 
					
						
							| 
									
										
										
										
											2015-05-17 16:10:35 +00:00
										 |  |  |         if ($this->imaginaryPart != 0.0) { | 
					
						
							|  |  |  |             if (abs($this->imaginaryPart) != 1.0) { | 
					
						
							|  |  |  |                 $str .= $this->imaginaryPart . $this->suffix; | 
					
						
							|  |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2016-08-16 15:33:57 +00:00
										 |  |  |                 $str .= (($this->imaginaryPart < 0.0) ? '-' : '') . $this->suffix; | 
					
						
							| 
									
										
										
										
											2015-05-17 16:10:35 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if ($this->realPart != 0.0) { | 
					
						
							| 
									
										
										
										
											2015-05-17 16:34:30 +00:00
										 |  |  |             if (($str) && ($this->imaginaryPart > 0.0)) { | 
					
						
							| 
									
										
										
										
											2016-08-16 15:33:57 +00:00
										 |  |  |                 $str = '+' . $str; | 
					
						
							| 
									
										
										
										
											2015-05-17 16:34:30 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2015-05-17 16:10:35 +00:00
										 |  |  |             $str = $this->realPart . $str; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-05-17 16:34:30 +00:00
										 |  |  |         if (!$str) { | 
					
						
							| 
									
										
										
										
											2016-08-16 15:33:57 +00:00
										 |  |  |             $str = '0.0'; | 
					
						
							| 
									
										
										
										
											2015-05-17 16:34:30 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-08-16 15:33:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-17 16:10:35 +00:00
										 |  |  |         return $str; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |