【问题标题】:Display percentage as progress将百分比显示为进度
【发布时间】:2013-10-25 02:17:46
【问题描述】:

假设如下

  1. 我在一个列表中有 n 个对象
  2. 对象按顺序处理
  3. 我想在超过一定数量时显示完成百分比

例如,

我有 2204 个对象,一旦它处理了 221 个对象,我希望它显示 10%,然后一旦它处理了 441 个对象,我希望它显示 20%。基本上是为了让我知道队列在哪里。

用php写这个我有以下内容:

$i = 0;
$total = 2204 // result of getTotal();

foreach (range ($i, $total) as $i ) {
    //do some irrelevant processing
    if (($i/$total*100)%10 == 0) {
        echo number_format(($i/$total*100),0)."% done.\n";
    }
}

但是我的结果集不太理想,我得到以下输出:

0% done.
0% done.
0% done.
0% done.
0% done.
0% done.
0% done.
0% done.
0% done.
0% done.
0% done.
0% done.
1% done.
1% done.
1% done.
1% done.
1% done.
1% done.
1% done.
1% done.
1% done.
1% done.

我将如何做到这一点?

【问题讨论】:

  • 所以你只想要 0,1,2,3,4,5,6 等?
  • 您应该阅读浮点 PHP 参考 :) 无论如何,要“修复”这个问题,请根据条件四舍五入您的值:if(round($i/$total*100)%10 == 0) ...
  • @putvande 基本上是的,但对于 10 到 100 的倍数。
  • @onetrickpony 这行得通,但我最终完成了大约 10 0%,10 10% 完成,10 20$ 完成。等等。我只希望它显示一次。
  • 然后存储最后一个值,并在下一次迭代中将其与新值进行比较。

标签: php math


【解决方案1】:
$i = 0;
$total = 2204;

foreach (range ($i, $total) as $i ) {
    if ($i % floor($total/100) == 0) {
        echo number_format(($i/$total*100),0)."% done.\n";
    }
}

如果您只希望每个 10% (10,20,30...100) 不包含 0,您可以这样做:

$i = 0;
$total = 2204;

foreach (range ($i, $total) as $i ) {
    if ($i % floor($total/10) == 0 && $i > 0) {
        echo number_format(($i/$total*100),0)."% done.\n";
    }
}

【讨论】:

  • 这会导致在应该只有 10 个结果时显示 301 个结果(如果包含 0%,则可能是 11 个)。
  • 301 个结果?对我来说,它显示 0% ... 100%。你使用的是这个确切的代码吗?
【解决方案2】:

我看到你这里的逻辑还有另一个问题:

由于您在此列表中增加 +1,因此您不会得到确切的 10%、20%。 例如,当我执行以下操作时:

foreach (range ($i, $total) as $i ) {
    echo $i/$total."\n";
}

你会看到

0.19555353901996
0.19600725952813
0.1964609800363
0.19691470054446
0.19736842105263
0.1978221415608
0.19827586206897
0.19872958257713
0.1991833030853
0.19963702359347
0.20009074410163
0.2005444646098
0.20099818511797
0.20145190562613

您可能希望在乘以 100 后将其四舍五入,并维护一个单独的数组,您将在其中检查是否已显示这些值。

示例程序:

foreach (range ($i, $total) as $i ) {
    $val = round($i/$total*100)%10;
    $num = number_format(($i/$total*100),0);
if ($val == 0) {
    if(!in_array($num, $check)){
            $check[] =  $num;
            echo $num."% done.\n";
    }
}
}
?>

【讨论】:

    【解决方案3】:

    我的 2p 答案是使用检查变量

    <?php
    $i = 0;
    $total = 2204; // result of getTotal()
    $boundary=10;
    
    foreach (range ($i, $total) as $i ) {
        //do some irrelevant processing
        $ii=intval(($i/$total)*100);
        if($ii>=$boundary){
            echo $boundary . "% done.\n";
            $boundary+=10;
        }
    }
    
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-10
      • 2015-11-29
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多