14

スタック オーバーフローの評判表示に似た形式の文字列表現に数値を変換したいと考えています。

例えば

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

8 に答える 8

26

正確に目的の出力を生成する別のアプローチ:

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';
}

ここで出力結果を確認してください。

于 2010-07-05T08:19:21.190 に答える
10

更新: 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)== '1,000'
  • getRepString(9999)== '9,999'
  • getRepString(10000)== '10k'
  • getRepString(10100)== '10.1k'
于 2010-07-05T07:49:39.337 に答える
3

これは、iZend の一部である PHP の関数です - 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');
}
于 2012-06-19T08:02:01.243 に答える
0
 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();
   });
于 2014-01-07T20:09:20.520 に答える
0
// Shortens a number and attaches K, M, B, etc. accordingly
function number_shorten($number, $precision = 3, $divisors = null) {

    // Setup default $divisors if not provided
    if (!isset($divisors)) {
        $divisors = array(
            pow(1000, 0) => '', // 1000^0 == 1
            pow(1000, 1) => 'K', // Thousand
            pow(1000, 2) => 'M', // Million
            pow(1000, 3) => 'B', // Billion
            pow(1000, 4) => 'T', // Trillion
            pow(1000, 5) => 'Qa', // Quadrillion
            pow(1000, 6) => 'Qi', // Quintillion
        );    
    }

    // Loop through each $divisor and find the
    // lowest amount that matches
    foreach ($divisors as $divisor => $shorthand) {
        if (abs($number) < ($divisor * 1000)) {
            // We found a match!
            break;
        }
    }

    // We found our match, or there were no matches.
    // Either way, use the last defined value for $divisor.
    return number_format($number / $divisor, $precision) . $shorthand;
}

これは私にとってはうまくいきました。これが役立つことを願っています。この質問をしてくれてありがとう。

于 2019-12-02T13:55:55.220 に答える
-1

1000 で割り、結果が 1 より大きい場合は、数値を四捨五入し、最後に「k」を連結します。

結果が 1 未満の場合は、実際の結果を出力するだけです!

于 2010-07-05T08:59:30.190 に答える
-2

これを行うためにnpm (およびbower ) モジュールを作成しました。

npm install --save approximate-number

使用法:

var approx = require('approximate-number');
approx(123456); // "123k" 
于 2014-11-06T17:26:18.030 に答える