Я хочу преобразовать число в строковое представление с форматом, похожим на отображение репутации Stack Overflow.
например.
- 999 == '999'
- 1000 == '1000'
- 9999 == '9,999'
- 10000 == '10k'
- 10100 == '10.1k '
Я хочу преобразовать число в строковое представление с форматом, похожим на отображение репутации Stack Overflow.
например.
Другой подход, который дает точно желаемый результат:
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';
}
Проверьте результаты вывода здесь.
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 'Вот функция в 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');
}
Вот 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"
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();
});
Хотя этот вопрос был задан довольно давно, у меня есть другое решение, которое я считаю еще более простым:
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);
Я надеюсь, что это все еще полезно для кого-то.
разделите на 1000, то если результат больше 1 вокруг числа и соедините "k" на конце.
Если результат меньше 1, просто выведите фактический результат!
Я создал npm (и bower) для этого:
npm install --save approximate-number
Использование:
var approx = require('approximate-number');
approx(123456); // "123k"