2016-07-15 2 views
0

Итак, у меня есть этот класс, который ценит цифры. Например, 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]); 
    } 

} 
+0

Вашего регулярное выражение удаляет знак ... (а также любую десятичную точку) – rjdown

+1

Почему бы не вычислить его с помощью абсолютного значения а затем, если исходный ввод меньше 0, верните '0 - $ output'? –

ответ

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

Я вижу, что вы здесь сделали - очень приятно! –

1

Просто измените имя аргумента 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 подтвердить это.

Надеется, что это помогает немного ...

Приветствие & Удачи ;-)

+0

Это хорошо работает, спасибо. Но @cmorrissey предоставил немного более чистое решение. –

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; 
} 
Смежные вопросы