缩写数字功能不会输出负值

时间:2016-07-15 19:35:49

标签: php preg-replace

所以我有这个课程,欣赏数字。例如,AbbreviateNum::convert(1178);将向上舍入并将其转换为1.18K

这很有效。但是,我似乎无法弄清楚如何输出负数。如果我运行AbbreviateNum::convert(-1178);,它将输出相同的响应1.18K。没有负面指标。

有关我如何解决此问题的任何提示?

<?php

namespace App\Helpers;

class AbbreviateNum
{

    /**
     * Abbreviate long numbers
     * 
     * @return Response
     */
    public static function convert($num)
    {
        $num = preg_replace('/[^0-9]/', '', $num);
        $sizes = array("", "K", "M");

        if ($num == 0) return(0); 
        else return (round($num/pow(1000, ($i = floor(log($num, 1000)))), 2) . $sizes[$i]);
    }

}

3 个答案:

答案 0 :(得分:1)

只需更改convert方法论证(num)&amp;的名称即可。做一个简单的strstr()检查&#34; - &#34;。如果找到,请在结果前加上&#34; - &#34;像这样:

    <?php   

        namespace App\Helpers;

        class AbbreviateNum
        {

            /**
             * Abbreviate long numbers
             *
             * @return Response
             */
            public static function convert($givenNumber){
                $num    = preg_replace('/[^0-9]/', '', $givenNumber);
                $sizes = array("", "K", "M");

                if ($num == 0) {
                    return(0);
                }else {
                    $number =  (round($num/pow(1000, ($i = floor(log($num, 1000)))), 2) . $sizes[$i]);
                    if(strstr($givenNumber, "-")){
                        $number = "-" . $number;
                    }
                    return $number;
                }
            }

        }

        var_dump(AbbreviateNum::convert(-1785));
       // PRODUCES:   string '-1.79K' (length=6)

        var_dump(AbbreviateNum::convert(1785));
       // PRODUCES:   string '1.79K' (length=5)

确认HERE

希望这有点帮助...

干杯&amp;祝你好运; - )

答案 1 :(得分:1)

这是修改后的函数,它为它接受的字符串提供了更多的健壮性。

public static function convert($num)
{
    $num = intval(preg_replace('/[^\-\.0-9]/', '', $num));
    $sizes = array("", "K", "M");

    if ($num == 0) return(0); 
    else return (round($num/pow(1000, ($i = floor(log(abs($num), 1000)))), 2) . $sizes[abs($i)]);
}

答案 2 :(得分:1)

对于此类转换,我使用sprintf功能:

public static function convert($num) {
    $sizes = array("", "K", "M", "G", "T");
    $i = 0;
    $res = $num;
    while (abs($num) > 1000) {$num /= 1000; $i++; $res = sprintf("%.2f$sizes[$i]", $num);}
    return $res;
}