php - how to create "pretty" numbers? -
my question is: there (common) algorithm create numbers, match looking user understood numbers out of incomming (kind of random looking user) numbers.
i.e. have interval
130'777.12 - 542'441.17
.
but user want display more ...say userfriendly, like:
130'000 - 550'000
.
how can several dimensions? other example be:
23.07 - 103.50
20 - 150
do understand mean?
i should give criteria well:
- the interval min , max should include given limits.
- the "rounding" should in granularity reflects distance between min , max (meaning in our second example
20 - 200
coarse)
very honor you'll earn if know native php function can :-)
*update - 2011-02-21 *
i answer @ivan , accepted it. here solution far:
maybe can better. open proposals ;-).
/** * formats given float number readable number human beings * @author helle + ivan + greg * @param float $number * @param boolean $min regulates wheter min or max of interval * @return integer */ function pretty_number($number, $min){ $orig = $number; $digit_count = floor(log($number,10))+1; //capture count of digits in number (ignoring decimals) switch($digit_count){ case 0: $number = 0; break; case 1: case 2: $number = round($number/10) * 10; break; default: $number = round($number, (-1*($digit_count -2 )) ); break; } //be sure include interval borders if($min == true && $number > $orig){ return pretty_number($orig - pow(10, $digit_count-2)/2, true); } if($min == false && $number < $orig){ return pretty_number($orig + pow(10, $digit_count-2)/2, false); } return $number; }
i use log10 find how "long" number , round or down. here's quick , dirty example.
echo prettyfloor(23.07);//20 echo " - "; echo prettyceil(103.50);//110 echo prettyfloor(130777.12);//130000 echo " - "; echo prettyceil(542441.17);//550000 function prettyfloor($n) { $l = floor(log(abs($n),10))-1; // $l = how many digits have nullify :) if ($l<=0) $l++; if ($l>0) $n=$n/(pow(10,$l)); //moving decimal point $l positions left eg(if $l=2 1234 => 12.34 ) $n=floor($n); if ($l>0) $n=$n*(pow(10,$l)); //moving decimal point $l positions right eg(if $l=2 12.3 => 1230 ) return $n; } function prettyceil($n) { $l = floor(log(abs($n),10))-1; if ($l<=0) $l++; if ($l>0) $n=$n/(pow(10,$l)); $n=ceil($n); if ($l>0) $n=$n*(pow(10,$l)); return $n; }
this example unfortunately not convert 130 150. both 130 , 150 have same precision. thou us, humans 150 looks bit "rounder". in order achieve such result recommend use quinary system instead of decimal.
Comments
Post a Comment