PHP Подсчитайте раунд тысяч до уровня стиля K, как facebook Share., Кнопка кнопки Twitter

Хорошо, поэтому я пытаюсь превратить счетчик попаданий в тысячи, чтобы одна цифра тоже отображала 3 тысячи ударов, например, 3K, например, Facebook Share и Twitter. Вот мой код. Любая идея, что я делаю неправильно?

$postresultscount = (($resultscount) ? $resultscount->sumCount : 1);
$k = 1000;
$L = '';
if ($postresultscount > $k) {
    $echoxcount = round($postresultscount/$k);
    $L = 'K';
} else if ($postresultscount == $k) {
    $echoxcount = 1;
    $L = 'K';
} else {
    $echoxcount = $postresultscount;
}

echo 'document.write("'.$echoxcount.' '.$L.'")';

Ответ 1

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

функция

function thousandsCurrencyFormat($num) {

  if($num>1000) {

        $x = round($num);
        $x_number_format = number_format($x);
        $x_array = explode(',', $x_number_format);
        $x_parts = array('k', 'm', 'b', 't');
        $x_count_parts = count($x_array) - 1;
        $x_display = $x;
        $x_display = $x_array[0] . ((int) $x_array[1][0] !== 0 ? '.' . $x_array[1][0] : '');
        $x_display .= $x_parts[$x_count_parts - 1];

        return $x_display;

  }

  return $num;
}

Выход

thousandsCurrencyFormat(3000) - 3k
thousandsCurrencyFormat(35500) - 35.5k
thousandsCurrencyFormat(905000) - 905k
thousandsCurrencyFormat(5500000) - 5.5m
thousandsCurrencyFormat(88800000) - 88.8m
thousandsCurrencyFormat(745000000) - 745m
thousandsCurrencyFormat(2000000000) - 2b
thousandsCurrencyFormat(22200000000) - 22.2b
thousandsCurrencyFormat(1000000000000) - 1t (1 trillion)

Ресурсы

https://code.recuweb.com/2018/php-format-numbers-to-nearest-thousands/

Ответ 2

немного лучше, чем сообщение Юки

if ($value > 999 && $value <= 999999) {
    $result = floor($value / 1000) . ' K';
} elseif ($value > 999999) {
    $result = floor($value / 1000000) . ' M';
} else {
    $result = $value;
}

Ответ 3

Используйте floor вместо round, если вы хотите, чтобы 3500 округлилось до 3 K.

В противном случае ваш код работает, хотя и проблематично. Попробуйте следующее:

if ($postresultscount > 1000) {
  $result = floor($postresultscount / 1000) . 'K';
} else {
  $result = $postresultscount;
}

echo 'document.write("' . $result . '")";

Также кажется, что вы пишете JavaScript с помощью PHP. Будьте осторожны.

Ответ 4

function shortNumber($num) 
{
    $units = ['', 'K', 'M', 'B', 'T'];
    for ($i = 0; $num >= 1000; $i++) {
        $num /= 1000;
    }
    return round($num, 1) . $units[$i];
}

Я адаптировал эту функцию из функции, созданной для отображения байтов в удобочитаемой для человека форме с помощью bashy здесь:

https://laracasts.com/discuss/channels/laravel/human-readable-file-size-and-time

Ответ 5

Вопросу 8 лет, но каждый раз, когда я вижу ответ, содержащий утверждение else, я думаю, что это можно сделать лучше (чище).

<?php

if (!function_exists('format_number_in_k_notation')) {
    function format_number_in_k_notation(int $number): string
    {
        $suffixByNumber = function () use ($number) {
            if ($number < 1000) {
                return sprintf('%d', $number);
            }

            if ($number < 1000000) {
                return sprintf('%d%s', floor($number / 1000), 'K+');
            }

            if ($number >= 1000000 && $number < 1000000000) {
                return sprintf('%d%s', floor($number / 1000000), 'M+');
            }

            if ($number >= 1000000000 && $number < 1000000000000) {
                return sprintf('%d%s', floor($number / 1000000000), 'B+');
            }

            return sprintf('%d%s', floor($number / 1000000000000), 'T+');
        };

        return $suffixByNumber();
    }
}

dump(format_number_in_k_notation(123)); // "123"
dump(format_number_in_k_notation(73000)); // "73K+"
dump(format_number_in_k_notation(216000)); // "216K+"
dump(format_number_in_k_notation(50400123)); // "50M+"
dump(format_number_in_k_notation(12213500100600)); // "12T+"

die;

Ответ 6

Это модифицированная версия с k и m в нижнем регистре и отображение одного десятичного знака для миллинов.

<?php

    if ($value > 999 && $value <= 999999) {
    $result  = floor($value / 1000) . 'k';
    } elseif ($value > 999999) {
    $result  = number_format((float)$value , 1, '.', '')/1000000 . 'm';
    } else {
    $result  = $value;
    }
?>

Ответ 7

if ($postresultscount > 999999) {
    $postresultscount = floor($postresultscount / 1000000) . ' M';
}
elseif ($postresultscount > 999) {
    $postresultscount = floor($postresultscount / 1000) . ' K';
}
echo $postresultscount;

Ответ 8

function print_number_count($number) {
    $units = array( '', 'K', 'M', 'B');
    $power = $number > 0 ? floor(log($number, 1000)) : 0;
    if($power > 0)
        return @number_format($number / pow(1000, $power), 2, ',', ' ').' '.$units[$power];
    else
        return @number_format($number / pow(1000, $power), 0, '', '');
}

Ответ 9

Округление, без учета каких-либо сокращений выше 'k' или тысяч, показывающих один десятичный знак.

function numToKs($number) {
    if ($number >= 1000) {
        return number_format(($number / 1000), 1) . 'k';
    } else {
        return $number;
    }
}
numToKs(1)          = 1
numToKs(111)        = 111
numToKs(999)        = 999
numToKs(1000)       = "1.0k"
numToKs(1499)       = "1.5k"
numToKs(1500)       = "1.5k"
numToKs(1501)       = "1.5k"
numToKs(1550)       = "1.6k"
numToKs(11501)      = "11.5k"
numToKs(1000000000) = "1,000,000.0k"
numToKs(1234567890) = "1,234,567.9k"

Ответ 10

Этот вопрос имеет ту же цель, что и этот вопрос здесь Сократить длинные числа до K/M/B?

Ссылка: https://gist.github.com/RadGH/84edff0cc81e6326029c

Попробуйте этот код:

function number_format_short( $n, $precision = 1 ) {
    if ($n < 900) {
        // 0 - 900
        $n_format = number_format($n, $precision);
        $suffix = '';
    } else if ($n < 900000) {
        // 0.9k-850k
        $n_format = number_format($n / 1000, $precision);
        $suffix = 'K';
    } else if ($n < 900000000) {
        // 0.9m-850m
        $n_format = number_format($n / 1000000, $precision);
        $suffix = 'M';
    } else if ($n < 900000000000) {
        // 0.9b-850b
        $n_format = number_format($n / 1000000000, $precision);
        $suffix = 'B';
    } else {
        // 0.9t+
        $n_format = number_format($n / 1000000000000, $precision);
        $suffix = 'T';
    }
  // Remove unecessary zeroes after decimal. "1.0" -> "1"; "1.00" -> "1"
  // Intentionally does not affect partials, eg "1.50" -> "1.50"
    if ( $precision > 0 ) {
        $dotzero = '.' . str_repeat( '0', $precision );
        $n_format = str_replace( $dotzero, '', $n_format );
    }
    return $n_format . $suffix;
}

Приведенный выше код создает функцию для преобразования чисел. Чтобы использовать эту функцию позже, просто вызовите ее, как показано в коде ниже:

// Example Usage:
number_format_short(7201); // Output: 7.2k