Php 缩写数字功能赢得';t输出负值

Php 缩写数字功能赢得';t输出负值,php,preg-replace,Php,Preg Replace,所以我有一门课,它欣赏数字。例如,缩写num::convert(1178)将取整并将其转换为1.18K 这很好地发挥了应有的作用。然而,我似乎不知道如何输出负数。如果我运行缩写num::convert(-1178),它将输出相同的响应1.18K。没有负面指标 关于如何解决这个问题有什么建议吗 <?php namespace App\Helpers; class AbbreviateNum { /** * Abbreviate long numbers *

所以我有一门课,它欣赏数字。例如,
缩写num::convert(1178)
将取整并将其转换为
1.18K

这很好地发挥了应有的作用。然而,我似乎不知道如何输出负数。如果我运行
缩写num::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)

只需更改
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)

这里是一个修改过的函数,它为它将接受的字符串提供了一点更健壮的功能

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

这是一个修改过的函数,它为它将接受的字符串提供了一点健壮性

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

对于这种转换,我将使用函数:

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

对于这种转换,我将使用函数:

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

您的正则表达式将删除符号。。。(以及任何小数点)为什么不从输入的绝对值计算它,然后如果原始输入小于0,则返回
0-$output
?您的正则表达式将删除符号。。。(以及任何小数点)为什么不从输入的绝对值计算它,然后如果原始输入小于0,则返回
0-$output
?我知道你在这里做了什么-非常好!我知道你在这里做了什么-非常好!这很有效,谢谢。但是@cmorrissey提供了一个稍微干净一点的解决方案。这很有效,谢谢。但是@cmorrissey提供了一个稍微干净一点的解决方案。