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

Popular posts from this blog

apache - Add omitted ? to URLs -

redirect - bbPress Forum - rewrite to wwww.mysite prohibits login -

php - How can I stop spam on my custom forum/blog? -