Как сократить большие числа до к, М и т.д.?

351
07 июля 2017, 07:23

Нужно сократить большие числа до к, М и т.д.

Например:

1000000 = 1М
500000 = 500к

По сути вот готовый вариант реализации, но непойму как сделать чтобы сократить числа со знаком "минус"? Например:

-1000000 = -1М
-500000 = -500к

Прошу помощи.

function number_name( $number )
{
  if( !is_numeric( $number  ) ) {
    return $number;
  }
  $digits = ceil( log10( $number ) ) -4 ; //число знаков минус 4
  $mult = pow( 10, $digits ) ; //множитель для оставления первых 4 знаков
  $number = round( $number / $mult ) ; //оставили 4 знака
  while( ( $number > 1000 ) || ( $digits % 3 != 0 ) ) {
    $number /= 10 ;
    $digits += 1 ;
  }
  $names = array( 0  => "",
                  3  => " к",
                  6  => " М",
                  9  => " Г",
                  12 => " Т"); //число нулей => название
  return $number.$names[ $digits ] ;
}
Answer 1
function number_name( $number )
{
    if( !is_numeric( $number  ) ) {
        return $number;
    }
    $isNegative = ($number < 0); //определение отрицательного числа
    if($isNegative) $number *= -1; //приведение к абсолютному
    $digits = ceil( log10( $number ) ) -4 ; //число знаков минус 4
    $mult = pow( 10, $digits ) ; //множитель для оставления первых 4 знаков
    $number = round( $number / $mult ) ; //оставили 4 знака
    while( ( $number > 1000 ) || ( $digits % 3 != 0 ) ) {
        $number /= 10 ;
        $digits += 1 ;
    }
    $names = array( 0  => "",
        3  => " к",
        6  => " М",
        9  => " Г",
        12 => " Т"); //число нулей => название
    if($isNegative) $number *= -1; //возвращение к отрицательному, если нужно
    return $number.$names[ $digits ] ;
}

Добавил только обработку отрицательных, остальное оставил Ваше.

Answer 2

Я бы сделал чуть проще (без возведения в степень и логарифмов):

function number_name($number)
{
    $count = array("", "k", "M", "G", "T");
    $i = 0;
    while (abs($number) > 1000) {
        $number /= 1000;
        $i++;
    }
    return $number.$count[$i];
}
echo number_name(5)."\n";
echo number_name(5000)."\n";
echo number_name(-5000)."\n";
echo number_name(5000000)."\n";
echo number_name(5000000000)."\n";
echo number_name(5000000000000);

Вывод:

5
5k
-5k
5M
5G
5T
READ ALSO
Создание объявлений по типу cian.ru slando.ru и тд [требует правки]

Создание объявлений по типу cian.ru slando.ru и тд [требует правки]

Цель: создать функцию позволяющую добавлять объявления на сайт с несколькими изображениями, и выводить их на определенных страницах

219
Можно ли подменить trait в тесте?

Можно ли подменить trait в тесте?

У меня есть класс, часть функционала в котором реализует traitЧтобы все протестировать необходимо данный trait подменить на свой (тестовый)

195
Ajax запрос для запуска PHP скрипта

Ajax запрос для запуска PHP скрипта

В общем, у меня есть форма, я аяксом передаю данные с формы в файлик пхп и из него в бд, потом есть еще один файлик пхп который забирает данные...

214
Работа с объектами UI в другом классе Qt

Работа с объектами UI в другом классе Qt

Хочу напрямую обращаться к элементам интерфейса, содержащихся в Ui MainWindowКак это реализовать, не используя сигналы и слоты? Мне нужно передать...

428