NumberLib.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. <?php
  2. //TODO: rename to TimeLib or move the time stuff to a time lib???!!!
  3. /**
  4. * 2011-03-07 ms
  5. */
  6. class NumberLib {
  7. /**
  8. * get the rounded average
  9. * @param array $values: int or float values
  10. * @param int $precision
  11. * @return int $average
  12. * 2009-09-05 ms
  13. */
  14. public static function average($values, $precision = 0) {
  15. $average = round(array_sum($values) / count($values), $precision);
  16. return $average;
  17. }
  18. /**
  19. * @access public
  20. * @param float $number
  21. * @param float $increment
  22. * @return float $result
  23. * 2011-04-14 lb
  24. */
  25. public static function roundTo($number, $increments = 1.0) {
  26. return round($number, self::getDecimalPlaces($increments));
  27. }
  28. /**
  29. * @access public
  30. * @param float $number
  31. * @param int $increment
  32. * @return float $result
  33. * 2011-04-14 lb
  34. */
  35. public static function roundUpTo($number, $increments = 1) {
  36. return (ceil($number / $increments) * $increments);
  37. }
  38. /**
  39. * @access public
  40. * @param float $number
  41. * @param int $increment
  42. * @return float $result
  43. * 2011-04-14 lb
  44. */
  45. public static function roundDownTo($number, $increments = 1) {
  46. return (floor($number / $increments) * $increments);
  47. }
  48. /**
  49. * @access public
  50. * @param float $number
  51. * @return int $decimalPlaces
  52. * 2011-04-15 lb
  53. */
  54. public static function getDecimalPlaces($number) {
  55. $decimalPlaces = 0;
  56. while ($number > 1 && $number != 0) {
  57. $number /= 10;
  58. $decimalPlaces -= 1;
  59. }
  60. while ($number < 1 && $number != 0) {
  61. $number *= 10;
  62. $decimalPlaces += 1;
  63. }
  64. return $decimalPlaces;
  65. }
  66. /**
  67. * hours, minutes
  68. * e.g. 9.3 => 9.5
  69. * 2010-11-03 ms
  70. */
  71. public static function standardToDecimalTime($value) {
  72. $base = (int)$value;
  73. $tmp = $value-$base;
  74. $tmp *= 100;
  75. $tmp *= 1/60;
  76. $value = $base+$tmp;
  77. return $value;
  78. }
  79. /**
  80. * hours, minutes
  81. * e.g. 9.5 => 9.3
  82. * with pad=2: 9.30
  83. * 2010-11-03 ms
  84. */
  85. public static function decimalToStandardTime($value, $pad = null, $decPoint = '.') {
  86. $base = (int)$value;
  87. $tmp = $value-$base;
  88. $tmp /= 1/60;
  89. $tmp /= 100;
  90. $value = $base+$tmp;
  91. if ($pad === null) {
  92. return $value;
  93. }
  94. return number_format($value, $pad, $decPoint, '');
  95. }
  96. /**
  97. * parse 2,5 - 2.5 2:30 2:31:58 or even 2011-11-12 10:10:10
  98. * now supports negative values like -2,5 -2,5 -2:30 -:30 or -4
  99. * @param string
  100. * @return int: seconds
  101. * 2011-03-06 ms
  102. */
  103. public static function parseTime($duration, $allowed = array(':', '.', ',')) {
  104. if (empty($duration)) {
  105. return 0;
  106. }
  107. $parts = explode(' ', $duration);
  108. $duration = array_pop($parts);
  109. if (strpos($duration, '.') !== false && in_array('.', $allowed)) {
  110. App::uses('NumberLib', 'Tools.Lib');
  111. //$numberLib = new NumberLib();
  112. $duration = NumberLib::decimalToStandardTime($duration, 2, ':');
  113. } elseif (strpos($duration, ',') !== false && in_array(',', $allowed)) {
  114. App::uses('NumberLib', 'Tools.Lib');
  115. $duration = str_replace(',', '.', $duration);
  116. $duration = NumberLib::decimalToStandardTime($duration, 2, ':');
  117. }
  118. # now there is only the time schema left...
  119. $pieces = explode(':', $duration, 3);
  120. $res = 0;
  121. $hours = abs((int)$pieces[0])*HOUR;
  122. //echo pre($hours);
  123. $isNegative = (strpos((string)$pieces[0], '-') !== false ? true : false);
  124. if (count($pieces) === 3) {
  125. $res += $hours + ((int)$pieces[1])*MINUTE + ((int)$pieces[2])*SECOND;
  126. } elseif (count($pieces) === 2) {
  127. $res += $hours + ((int)$pieces[1])*MINUTE;
  128. } else {
  129. $res += $hours;
  130. }
  131. if ($isNegative) {
  132. return -$res;
  133. }
  134. return $res;
  135. }
  136. /**
  137. * parse 2022-11-12 or 12.11.2022 or even 12.11.22
  138. * @param string $date
  139. * @return int: seconds
  140. * 2011-03-09 ms
  141. */
  142. public static function parseDate($date, $allowed = array('.', '-')) {
  143. $datePieces = explode(' ', $date, 2);
  144. $date = array_shift($datePieces);
  145. if (strpos($date, '.') !== false) {
  146. $pieces = explode('.', $date);
  147. $year = $pieces[2];
  148. if (strlen($year) === 2) {
  149. if ($year < 50) {
  150. $year = '20'.$year;
  151. } else {
  152. $year = '19'.$year;
  153. }
  154. }
  155. $date = mktime(0, 0, 0, $pieces[1], $pieces[0], $year);
  156. } elseif (strpos($date, '-') !== false) {
  157. //$pieces = explode('-', $date);
  158. $date = strtotime($date);
  159. } else {
  160. return 0;
  161. }
  162. return $date;
  163. }
  164. /**
  165. * return strings like 2:30 (later //TODO: or 2:33:99) from seconds etc
  166. * @param int: seconds
  167. * @return string
  168. * 2011-03-06 ms
  169. */
  170. public static function buildTime($duration, $mode = 'H:MM') {
  171. if ($duration < 0) {
  172. $duration = abs($duration);
  173. $isNegative = true;
  174. }
  175. $minutes = $duration%HOUR;
  176. $hours = ($duration - $minutes)/HOUR;
  177. $res = (int)$hours.':'.str_pad(intval($minutes/MINUTE), 2, '0', STR_PAD_LEFT);
  178. if (strpos($mode, 'SS') !== false) {
  179. //TODO
  180. }
  181. if (!empty($isNegative)) {
  182. $res = '-'.$res;
  183. }
  184. return $res;
  185. }
  186. /**
  187. * return strings like 2:33:99 from seconds etc
  188. * @param int: seconds
  189. * @return string
  190. * 2011-03-09 ms
  191. */
  192. public static function buildDefaultTime($duration) {
  193. $minutes = $duration%HOUR;
  194. $duration = $duration - $minutes;
  195. $hours = ($duration)/HOUR;
  196. //$duration = $minutes*MINUTE;
  197. $seconds = $minutes%MINUTE;
  198. return self::pad($hours).':'.self::pad($minutes/MINUTE).':'.self::pad($seconds/SECOND);
  199. }
  200. public static function pad($value, $length = 2) {
  201. return str_pad(intval($value), $length, '0', STR_PAD_LEFT);
  202. }
  203. }