у меня вопрос: есть ли хороший (общий) алгоритм для создания чисел, которые соответствуют хорошо выглядящим понятным для пользователя числам из числа входящих (типа случайного поиска пользователя).
то есть у вас естьинтервал от
130'777.12 - 542'441.17
.
Но для пользователя вы хотите отобразить что-то более ... скажем, удобное для пользователя, например:
130'000 - 550'000
.
как вы можете сделать это для нескольких измерений?другой пример:
23.07 - 103.50
до 20 - 150
Вы понимаете, что я имею в виду?
Я также должен дать несколько критериев:
- интервал min и max должен включать заданные пределы.
- "округление" должно быть в гранулярности, которая отражает расстояние между min и max (значение во втором примере
20 - 200
будетслишком грубо)
очень большая честь, которую вы заработаете, если знаете встроенную функцию php, которая может сделать это: -)
* обновление - 2011-02-21 *
Мне нравится ответ от @Ivan, и я его принял.Вот мое решение до сих пор:
возможно, вы можете сделать это лучше.Я открыт для любых предложений; -).
/**
* formats a given float number to a well readable number for human beings
* @author helle + ivan + greg
* @param float $number
* @param boolean $min regulates wheter its the min or max of an 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 to include the 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;
}