这样的事情:
echo somefn(2800000000); // outputs '2,8B' for 2,8 billion
echo somefn(2000000); // outputs '2M' for 2 million
echo somefn(5400); // outputs '5,4K' for 5,400
echo somefn('blabla') // outputs 'blabla' as it is because it isn't a number
echo somefn(5) // outputs 5, nothing to simplify
我知道它一定是非常简单的代码,但我想知道是否还有其他人可以解释其他可能不会出现在我脑海中的案例。
/编辑我正在寻找更广泛的内置PHP函数(或接近它的东西)。 strtotime()
几乎可以处理“周”或“月”之类的事情。
答案 0 :(得分:4)
我不知道你可以打电话的任何现成功能。这是一个可能的解决方案:
function number_abbr($number) {
if (!is_numeric($number) || $number < 1000)
return $number;
$postfix = array("K", "M", "B", "T");
while ($number >= 1000 && count($postfix) > 0) {
$number /= 1000;
$append = array_shift($postfix);
}
// if the number is still greater than 1000...
if ($number > 1000)
return "a lot";
// return the output
return sprintf("%1.1f" . $append, $number);
}
答案 1 :(得分:2)
这看起来非常好用:
function somefn( $num) {
if( !is_numeric( $num)) return $num;
$num = floatval( $num);
$suffix = '';
if( $num / 1000000000 > 1) {
$num = $num / 1000000000;
$suffix = 'B';
}
elseif( $num / 1000000 > 1) {
$num = $num / 1000000;
$suffix = 'M';
}
elseif( $num / 1000 > 1) {
$num = $num / 1000;
$suffix = 'K';
}
return number_format( $num, 1, ',', ',') . ' ' . $suffix;
}
输出:
2,8 B
2,0 M
5,4 K
blabla
5,0
您当然可以调整它以精确匹配所需的输出。 Here is a demo显示它的实际效果。
答案 2 :(得分:0)
环路。
function abbr_number($size,$decimals=2,$sizes = array("","K","M","B","T")) {
if(!is_numeric($size) || $size==0) return ($size);
if(!is_numeric($decimals) || $decimals<0) $decimals=2;
$size=abs($size);
$n = ($size/pow(1000,($i = floor(log($size, 1000)))))*
(isset($sizes[$i])?1:pow(1000,$i-(count($sizes)-1)).end($sizes));
return ($size<=0?'-':'').($size>0 ? round($n*pow(10,$decimals))/pow(10,$decimals):$n).
(isset($sizes[$i])?$sizes[$i]:array_pop($sizes));
}
echo(implode('<br />',array(
abbr_number(2800000000),
abbr_number(2000000),
abbr_number(5400),
abbr_number('blabla'),
abbr_number(5),
abbr_number(pow(rand(),rand(1,5)))
)));