根据数据库中的舍入总计更改文本

时间:2010-04-11 16:11:21

标签: php string numbers evaluation

在网站上我有许多小的PHP脚本来自动更改网站文本,具体取决于从MySQL数据库计算的数字。该网站适用于筹款小组,主页上的相关文字提供了总金额。

筹集的金额从数据库中提取并四舍五入到最接近的千位数。这是我用来舍入数字并查找总数的最后三位数的PHP:

  

$ query4 = mysql_query(“SELECT SUM(amountraised)AS full_total FROM fundraisingtotal;”);
              $ result4 = mysql_fetch_array($ query4);
              $ fulltotal = $ result4 [“full_total”];
              $ num = $ fulltotal + 30000;
              $ ftotalr = round($ num,-3);
                          $ roundnum = round($ num);
              $ string = $ roundnum;
              $ length = strlen($ string);
              $ characters = 3;
              $ start = $ length - $ characters;
              $ string = substr($ string,$ start,$ characters);
              $ figure = $ string;

(30,000英镑是之前筹款团队从项目首次开始时筹集的金额,这就是我为$ num变量添加30000到$ fulltotal的原因)

目前案文如下:
    the bookstall and other fundraising events have raised more than &pound;<? echo number_format($ftotalr); ?>

我刚刚意识到,因为PHP正在四舍五入到最接近的千位,如果总数为例如39,200英镑而且四舍五入到40,000英镑,说它超过40,000英镑是不正确的,在那种情况下我'需要它说'差不多4万英镑'或类似的东西。我显然需要用变量替换'more than'。

显然我需要测试总数的最后三位数是否接近0或1000,所以如果总数是例如£39,2000,那么文本会读到'刚刚结束',如果它在£之间39,250和39,400英镑之类的东西比'过去',39,400英镑到39,700英镑之间的东西就像'结束',39,700英镑到39,999英镑之间'差不多'。

我设法将总数的最后三位数作为变量,我想我需要某种if / else / elseif代码块(不确定这是否是正确的方法,或者是否用例/休息),显然我将不得不检查数字是否符合每个标准,但我无法弄清楚如何做到这一点。有人可以建议最好的方法吗?

4 个答案:

答案 0 :(得分:1)

而不是嵌套的if else块,你可以有一个接受美元金额的函数,在函数内部将变量抛出switch case语句,在特定情况下返回正确的{{1 }}'d text。

切换案例提供了几个echo语句的可读性。如果您需要coIde示例,请与我们联系。

更新

仅对整数进行比较,if else是最好的选择。在比较导致布尔值的条件时,使用switch case就是您所需要的。

我已经接受了您的代码并将if else切换为case,这是示例输出的样子:

if else

答案 1 :(得分:1)

最简单,最优雅的解决方案就像Lizard指出的那样,将价值放在首位,并且总是说“结束”。你甚至可以对前1000个问题做出例外处理,并将其下面的任何内容放到下一个100左右,例如...

<?
function getFlooredText($amount) {
    if($amount < 1000) {
        return floor($amount/100)*100;
    } else {
        return floor($amount/1000)*1000;
    }
}

echo "We've raised over &pound;" . getFlooredText(455) . "\n"; // 400
echo "We've raised over &pound;" . getFlooredText(1455) . "\n"; // 1000
echo "We've raised over &pound;" . getFlooredText(38800) . "\n"; // 38000
?>

如果你绝对不希望你总是可以做一个四层或五层if-sandwich,那么这对你所描述的想法来说是最简单的方法,但也许不是最漂亮的。这样的事情,如果我明白你要去哪里......

<?
function getRoundedText($amount) {
    $n = substr($amount, -3);
    if($n < 250) {
        return "just over &pound;" . round($amount, -3);
    } elseif($n < 500) {
        return "well over &pound;" . round($amount, -3);
    } elseif($n < 750) {
        return "close to &pound;" . round($amount, -3);
    } elseif($n < 1000) {
        return "almost &pound;" . round($amount, -3);
    }
}

echo "We've raised " . getRoundedText(38200) . "\n";
echo "We've raised " . getRoundedText(38400) . "\n";
echo "We've raised " . getRoundedText(38700) . "\n";
echo "We've raised " . getRoundedText(38900) . "\n";
?>

希望有所帮助。

答案 2 :(得分:0)

您可能无需更改文字...请查看floor函数http://php.net/manual/en/function.floor.php

它总是向下舍入,所以你仍然可以说'超过'。

答案 3 :(得分:0)

我会用“约”来涵盖所有情况!