Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;俚语;php中的大数字?_Php - Fatal编程技术网

&引用;俚语;php中的大数字?

&引用;俚语;php中的大数字?,php,Php,大概是这样的: 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 so

大概是这样的:

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函数中寻找更多的东西(或者类似的东西)。几乎同样的
strotime()
可以处理“周”或“月”之类的事情。

我不知道有什么现成的函数可以调用。这里有一个可能的解决方案:

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);
}
函数编号\u缩写($number){
如果(!是数值($number)|$number<1000)
返回$number;
$postfix=数组(“K”、“M”、“B”、“T”);
而($number>=1000&&count($postfix)>0){
$number/=1000;
$append=数组移位($postfix);
}
//如果数字仍然大于1000。。。
如果($number>1000)
回报“很多”;
//返回输出
返回sprintf(“%1.1f”。$append,$number);
}

这似乎很有效:

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 
当然,您可以调整它以精确匹配所需的输出。在运行中显示它。

无循环

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)))
)));
函数缩写号($size,$decimals=2,$size=array(“,”K“,”M“,”B“,”T”)){
如果(!is_numeric($size)|$size==0)返回($size);

如果(!is_numeric($decimals)| |$decimals“我知道这一定是非常简单的代码”,太好了,那就写吧。这个俚语似乎很武断,如果没有一系列的规则,你能做什么呢?算出你是否想对数字进行四舍五入,否则你必须考虑在没有四舍五入信息的情况下(例如尾随零的数量)要减少到的最小缩写版本是什么。请定义您试图解决的问题,发布您迄今为止所写的不起作用的内容,并解释它如何没有按您希望的方式工作,我们将尽力提供帮助。我们不是为您工作;如果您需要,请雇佣顾问或承包商。@Dagon这就是这个问题的目的。同样的方式
strotime
co从“周”或“月”这类通用的东西转换过来,我想可能有一些类似于内置转换函数的东西。