From: Penny Leach Date: Tue, 15 Dec 2009 14:27:16 +0000 (+0100) Subject: Added function to round to nearest 1/4 hour X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=95ea48d303666a3baa6eab2d510736c42c6e42cf;p=tks.git Added function to round to nearest 1/4 hour --- diff --git a/tks.pl b/tks.pl index 4514b30..c17abb5 100755 --- a/tks.pl +++ b/tks.pl @@ -91,18 +91,21 @@ foreach my $date ( sort keys %{$tkdata} ) { foreach my $entry ( sort { $a->{wr} <=> $b->{wr} } @{$tkdata->{$date}} ) { $date_has_data = 1; - printf("%s\t%5d\t%.2f\t%s\n", $date, $entry->{wr}, $entry->{time}, ($entry->{review_needed} ? '[review] ' : '') . $entry->{comment}); + $entry->{newtime} = sprintf("%.2f", int($entry->{time} * 100 + .5) / 100); + my ($hours, $mins) = split(/\./, $entry->{newtime}); + $entry->{newtime} = $hours . '.' . round($mins, 25); # round to the nearest quarter of an hour + + printf("%s\t%5d\t%.2f\t(%.2f)\t%s\n", $date, $entry->{wr}, $entry->{newtime}, $entry->{time}, ($entry->{review_needed} ? '[review] ' : '') . $entry->{comment}); next unless $args->{'-c'}; - $entry->{time} = int($entry->{time} * 100 + .5) / 100; # add the time to wrms my $win = $wrms->add_time( $entry->{wr}, $date, $entry->{comment}, - $entry->{time}, + $entry->{newtime}, $entry->{review_needed}, $entry->{subwr}, ); @@ -119,8 +122,9 @@ foreach my $date ( sort keys %{$tkdata} ) { my $day_time_taken = sum map { $_->{time} or 0 } @{$tkdata->{$date}}; - printf(" " x length($date) . "\t\t%.2f\n\n", $day_time_taken) if $date_has_data; - $total_time += $day_time_taken if $day_time_taken; + my $day_newtime_taken = sum map { $_->{newtime} or 0 } @{$tkdata->{$date}}; + printf(" " x length($date) . "\t\t%.2f\t(%.2f)\n\n", $day_newtime_taken, $day_time_taken) if $date_has_data; + $total_time += $day_newtime_taken if $day_time_taken; } write_file($args->{''}, @lines) if $file_needs_write; @@ -294,3 +298,51 @@ sub convert_to_minutes { } die("Time in invalid format: $time"); } + + + +sub round { + + my ($min, $pos) = @_; + my %boundaries = ( + 25 => { + 0 => [ 0 .. 24 ], + 25 => [ 25 .. 49 ], + 50 => [ 50 .. 74 ], + 75 => [ 75 .. 99 ] + }, + ); + + # keep track of previous time round + my $interval = 0; + my $lastrounded = 0; + my $lastkey; + + foreach my $v (sort keys %{$boundaries{$pos}}) { + return $v if ($v == $min); + my $thiskey = grep (/^$min$/, @{$boundaries{$pos}{$v}}); + if ($thiskey) { + $interval = abs($min - $v); + $lastrounded = $v; + } elsif (!$thiskey && $interval) { + my $newinterval = abs($min - $v); + return &round_compare($v, $newinterval, $lastrounded, $interval); + } + $lastkey = $v; + } + my $newinterval = abs($min - $lastkey); + return &round_compare($lastkey, $newinterval, $lastrounded, $interval); +} + +sub round_compare { + my ($key1, $interval1, $key2, $interval2) = @_; + + return $key1 if $interval2 == 0; + return $key2 if $interval1 == 0; + + return $key1 if $interval1 < $interval2; + return $key2 if $interval2 < $interval1; + + return $key1 if $interval1 == $interval2; +} +