-4

像这样的东西:

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

我知道它一定是非常简单的代码,但我想知道是否有其他人有一些东西可以解释可能其他情况现在不会出现在我脑海中的情况。

/Edit我正在寻找更通用的内置 PHP 函数(或类似的函数)。几乎相同的方式strtotime()可以处理诸如“周”或“月”之类的事情。

4

3 回答 3

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);
}
于 2012-06-01T01:05:25.507 回答
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 

您当然可以调整它以精确匹配所需的输出。这是一个演示,展示了它的实际效果。

于 2012-06-01T01:08:57.827 回答
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)))
)));
于 2012-06-01T02:21:29.817 回答