Суммирование фунтов и унций

Ох уж эти фунты, русскому человеку очень сложно перестроиться на эту меру веса. Сегодня решил написать функцию по суммированию фунтов и унций.

Зачем? Затем, что в одном фунте 16 унций, а когда есть несколько позиций, которые надо сложить можно мозг сломать.

Что она делает? Корректно подсчитывает сумму унций и фунтов, если унций 16 и более — транформирует их в фунты.

function calcweight($pound,$ounce)
{
	$p=explode(",",$pound);
	$o=explode(",",$ounce);
	for ($i=1; $i<=count($p) +1; $i++)
		{
			$poundfinal=$poundfinal+$p[$i-1];
		}

	for ($i=1; $i<=count($o) +1; $i++)
		{
			$ouncefinal=$ouncefinal+$o[$i-1];
		}
		$on=fmod($ouncefinal,16); // остаток фунтов из унций
		$pplus=floor($ouncefinal/16); // что надо будет приплюсовать в фунтам
		$ouncefinal=$on; // плюсуем остаток из унций к фунтам

		$po = $poundfinal+$pplus;
		$ou = $ouncefinal;
		return $po.';'.$ou; // выводим получившуюся сумму

}

Чтобы функция нормально работала нужно получить фунты и унции в таком виде

$pound="1,4,23,6,7";
$ounce="12.2,3,3.4,4,2";

Для этого можно воспользоваться циклом наподобие

while ($res=mysql_fetch_array($sql))
	{
		$pounds.=",".$res['pound'];
		$ounces.=",".$res['ounce'];
        }

Пример работы функции

echo calcweight("1.3,2.5,2.5,10","13.3,1.5,1,1"); //17.3;0.8

Обновлено: изменен разделитель на выходе, теперь это «;» — для подсчета дробных чисел.

Суммирование фунтов и унций: 3 комментария

  1. ling

    К слову, скрипт можно подсократить за счет уменьшения вычислений в циклах:

    function calcweight($pound, $ounce){
    $p = explode(«,», $pound);
    $o = explode(«,», $ounce);

    $pf = 0;
    $of = 0;
    for($i = 0, $il = sizeof($p); $i < $il; $i++)
    $pf += $p[$i];
    for($i = 0, $il = sizeof($o); $i < $il; $i++)
    $of += $o[$i];

    $pplus = floor($of/16); // что надо будет приплюсовать в фунтам
    $of = $of — $pplus*16; // остаток фунтов из унций

    return ($pf + $pplus) . '.' . $of; // выводим получившуюся сумму
    }

    И хорошо было бы еще обрабатывать дробные значения. Тогда было бы совсем айс. =)

    1. ОзимОзим Автор записи

      да, насчет дробных, в принципе, можно подумать.

    2. ОзимОзим Автор записи

      Теперь считает дробные, по сути и раньше считало — но разделитель точка мешал бы распарсить результат, заменил на точку с запятой.

Комментарии запрещены.