缩写数字函数不会输出负值

Abbreviate Number Function Won't Output Negative Value

所以我有这个 class,它欣赏数字。例如,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]);
    }

}

只需更改 convert 方法参数的名称 (num) 并执行简单的 strstr() 检查“-”。如果找到,请在结果前加上“-”前缀,如下所示:

    <?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.

希望对您有所帮助...

干杯,祝你好运 ;-)

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

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)]);
}

对于这样的转换,我会使用 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;
}