Patch for round fractions in phpcookbook

From finninday
Jump to navigation Jump to search

The shopping list page shows decimal amounts instead of fractions. It would be nicer if it rounded decimals to the nearest simple fraction. This code does that to the nearest 1/8th.

Apply the change to modules/lists/print.php

<?php
foreach ($useLayout as $section) {
    // Print the header here if requested
    $html = makeHtmlList($items, $section);
    if (count($html)) {
        // print the header
        printHeader($section);
    }
    //foreach ($html as $line) echo str_replace("<td>","<td>hi ",$line);
    foreach ($html as $line) {
        $fraction = 0;
        if ( preg_match("/\.\d+/",$line,$matches)) {
            $decimal = $matches[0];
            if ( abs($decimal-0.5) < 0.0625) {
              $fraction = " 1/2";
              $diff = abs($decimal-0.5);
            }
            if ( abs($decimal-0.25) < 0.0625) {
              $diff = abs($decimal-0.25);
              $fraction = " 1/4";
            }
            if ( abs($decimal-0.75) < 0.0625) {
              $fraction = " 3/4";
              $diff = abs($decimal-0.75);
            }
            if ( abs($decimal-0.125) < 0.0625) {
              $fraction = " 1/8";
              $diff = abs($decimal-0.125);
            }
            if ( abs($decimal-0.375) < 0.0625) {
              $fraction = " 3/8";
              $diff = abs($decimal-0.375);
            }
            if ( abs($decimal-0.625) < 0.0625) {
              $fraction = " 5/8";
              $diff = abs($decimal-0.625);
            }
            if ( abs($decimal-0.875) < 0.0625) {
              $fraction = " 7/8";
              $diff = abs($decimal-0.875);
            }
            if ( $decimal < 0.0625) {
              $fraction = " a tiny fraction of ";
            }
        }
        if ($fraction) $line = str_replace($decimal, $fraction, $line);
        $line = str_replace("0 ", "", $line);
        echo $line;
    }
}
// Show the lost ingredients (no section matched)