Подтвердить что ты не робот

Как форматировать числа, похожие на формат репутации Stack Overflow

Я хочу преобразовать число в строковое представление с форматом, похожим на отображение репутации Stack Overflow.

например.

  • 999 == '999'
  • 1000 == '1000'
  • 9999 == '9,999'
  • 10000 == '10k'
  • 10100 == '10.1k '
4b9b3361

Ответ 1

Другой подход, который дает точно желаемый результат:

function getRepString (rep) {
  rep = rep+''; // coerce to string
  if (rep < 1000) {
    return rep; // return the same number
  }
  if (rep < 10000) { // place a comma between
    return rep.charAt(0) + ',' + rep.substring(1);
  }
  // divide and format
  return (rep/1000).toFixed(rep % 1000 != 0)+'k';
}

Проверьте результаты вывода здесь.

Ответ 2

UPDATE: CMS получила чек и дает превосходный ответ. Отправьте ему больше голосов.

// formats a number similar to the way stack exchange sites 
// format reputation. e.g.
// for numbers< 10000 the output is '9,999'
// for numbers > 10000 the output is '10k' with one decimal place when needed
function getRepString(rep)
{
    var repString;

    if (rep < 1000)
    {
        repString = rep;
    }
    else if (rep < 10000)
    {
        // removed my rube goldberg contraption and lifted
        // CMS version of this segment
        repString = rep.charAt(0) + ',' + rep.substring(1);
    }
    else
    {
        repString = (Math.round((rep / 1000) * 10) / 10) + "k"
    }

    return repString.toString();
}

Вывод:

  • getRepString(999) == '999'
  • getRepString(1000) == '1000'
  • getRepString(9999) == '9,999'
  • getRepString(10000) == '10k'
  • getRepString(10100) == '10.1k '

Ответ 3

Вот функция в PHP, которая является частью iZend - http://www.izend.org/en/manual/library/countformat:

function count_format($n, $point='.', $sep=',') {
    if ($n < 0) {
        return 0;
    }

    if ($n < 10000) {
        return number_format($n, 0, $point, $sep);
    }

    $d = $n < 1000000 ? 1000 : 1000000;

    $f = round($n / $d, 1);

    return number_format($f, $f - intval($f) ? 1 : 0, $point, $sep) . ($d == 1000 ? 'k' : 'M');
}

Ответ 4

Вот CMS версия в PHP (если кому-то это понадобилось, как и я)

function getRepString($rep) {
    $rep = intval($rep);
    if ($rep < 1000) {
        return (string)$rep;
    }
    if ($rep < 10000) {
        return number_format($rep);
    }
    return number_format(($rep / 1000), ($rep % 1000 != 0)) . 'k';
}

// TEST
var_dump(getRepString(999));
var_dump(getRepString(1000));
var_dump(getRepString(9999));
var_dump(getRepString(10000));
var_dump(getRepString(10100));

Вывод:

string(3) "999"
string(5) "1,000"
string(5) "9,999"
string(3) "10k"
string(5) "10.1k"

Ответ 5

 Handlebars.registerHelper("classNameHere",function(rep) {
    var repString;
       if (rep < 1000)
    {
        repString = rep;
    }
    else if (rep < 10000)
    {
        rep = String(rep);
        r = rep.charAt(0);
        s = rep.substring(1);
        repString =  r + ',' + s;
    }
    else
    {
        repDecimal = Math.round(rep / 100) / 10;
        repString = repDecimal + "k";
    }
       return repString.toString();
   });

Ответ 6

Хотя этот вопрос был задан довольно давно, у меня есть другое решение, которое я считаю еще более простым:

function shorten($number){
$suffix = ["", "K", "M", "B"];
$precision = 1;
for($i = 0; $i < count($suffix); $i++){
  $divide = $number / pow(1000, $i);
  if($divide < 1000){
    return round($divide, $precision).$suffix[$i];
    break;
  }
}
}
echo shorten(1000);

Я надеюсь, что это все еще полезно для кого-то.

Ответ 7

разделите на 1000, то если результат больше 1 вокруг числа и соедините "k" на конце.

Если результат меньше 1, просто выведите фактический результат!

Ответ 8

Я создал npmbower) для этого:

npm install --save approximate-number

Использование:

var approx = require('approximate-number');
approx(123456); // "123k"