9

バイト単位のデータがあります。この値をチャート上に人が読めるラベル (2.5KB、14MB など) として描画し、関数 (入力データ - 実際の値、出力 - 人間が読める文字列) を支援する必要があります。

私はこのように機能しましたが、もっとエレガントな実現が欲しいです

function tickFormatter(value, type) {

    var suffix = (type == "bytes") ? ['B', 'KB', 'MB', 'GB'] : ['', 'K', 'M', 'G']

    if(value > (1024 * 1024 * 1024 * 1024)) {
        return (value / (1024 * 1024 * 1024 * 1024)).toFixed(2) + suffix[3]
    } else if(value > (1024 * 1024 * 1024)) {
        return (value / (1024 * 1024 * 1024)).toFixed(2) + suffix[2]
    } else if (value > (1024 * 1024)) {
        return (value / (1024 * 1024)).toFixed(2) + suffix[1]
    } else {
        return value.toFixed(2) + suffix[0]
    }
}
4

8 に答える 8

17

これは私が使用するものです。最も近い単位に切り上げるので、1000 は "0.98KB" です。それが望ましくない場合は、最初の Math.round を床に変更します。

var SizePrefixes = ' KMGTPEZYXWVU';
function GetHumanSize(size) {
  if(size <= 0) return '0';
  var t2 = Math.min(Math.round(Math.log(size)/Math.log(1024)), 12);
  return (Math.round(size * 100 / Math.pow(1024, t2)) / 100) +
    SizePrefixes.charAt(t2).replace(' ', '') + 'B';
}
于 2010-12-22T03:54:15.260 に答える
3

おそらくこのようなものですか?

function readable (nb_bytes) {
    if (nb_bytes < 1024) return nb_bytes + 'B';
    else if (nb_bytes < 1024 * 1024) return (Math.round((nb_bytes / 1024) * 100) / 100) + 'KB';
    else return (Math.round((nb_bytes / 1024 / 1024) * 100) / 100) + 'MB';
}

[編集]

よし、もっとエレガントなものが欲しいので、ループを考えていると思います。多分これはあなたのニーズに合うでしょう:

function readable (nb_bytes,type) {
    var suffix = type ? ['B','KB','MB','GB'] : ['','K','M','G'];
    var i = 0;
    while (nb_bytes > 1024 && i < suffix.length - 1) {
        ++i;
        nb_bytes = Math.round((nb_bytes / 1024) * 100) / 100;
    }
    return (nb_bytes) + suffix[i];
}

ここでtypeは、ブール値であると仮定しました-あなたに最も適したものに変更してください。

于 2010-12-21T12:06:49.413 に答える
1

上位 2 つのソリューションの中で最も優れていると感じたものを採用し、これを思いつきました。最初のソリューションよりも高速で、2 番目のソリューションよりも低速です。ただし、その目的は、丸めではなく、常に正確に 3 文字にすることです。3 文字の制限の理由は、それが配置されるコンテナーのサイズの制約によるものでした。さらに、非基数 2 の数値をフォーマットするために使用する必要がある場合は、キロを 1000 に変更するだけです。数値が 1k 未満の場合もショートします。

var kilo = 1024, suffix = ' KMGTPEZYXWVU', humanReadable = function (number) {
  var retValue = false;
  if (typeof number == "number") {
      if (number < kilo) {
          retValue = number.toString();
      } else {
          var e = Math.floor(Math.log(number) / Math.log(kilo));
          retValue = Number((number / Math.pow(kilo, e)).toString().slice(0, 3)) + suffix.charAt(e) + 'B';
      }
  }
  return retValue;
};
于 2013-11-15T00:59:53.537 に答える
1
function formatSize(size, standard) {
    if (standard) { 
        standard = standard.toLowerCase();
    }

    var n = 0, 
        base = standard == 'si' ? 1000 : 1024, 
        prefixes = ' KMGTPEZY';

    if (size < 1) {
        return 0;
    }
    else if (size >= base) {
        n = Math.floor( Math.log(size) / Math.log(base) );

        if (n >= prefixes.length) {
            return 'N/A';
        }

        size = ( size / Math.pow(base, n) ).toFixed(2) * 1 + ' ';
    }

    return size + prefixes[n] + ( n && standard == 'iec' ? 'i' : '' ) + 'B';
}

テスト:

for (var i = 0; i++ < 10;) console.log( formatSize( Math.pow(10, i) ) ); 

出力:

10 B
100 B
1000 B
9.77 KB
97.66 KB
976.56 KB
9.54 MB
95.37 MB
953.67 MB
9.31 GB
于 2013-04-03T13:34:23.533 に答える
1

Amer の修正版:

(function GetHumanSize(size) {
  var SizePrefixes = ['','K','M','G','T','P','E','Z','Y'];
  if(size <= 0) return '0';
  var t2 = Math.min(Math.round(Math.log(size)/Math.log(1024)),
                    SizePrefixes.length-1);
  return String((Math.round(size * 100 / Math.pow(1024, t2)) / 100)) + 
         ' ' + SizePrefixes[t2] + 'iB';
})(Math.pow(2,131)) === "2251799813685248 YiB"

と:

  • IEC サフィックス
  • 非標準のサフィックスなし
于 2012-09-28T21:29:31.250 に答える
0

あなたの答えは本当に役に立ちました。そのため、このサイズ形式の問題を完全に解決するユーティリティ メソッドを作成することにしました。

私の JSUtils リポジトリ wiki ページをチェックしてください: https://bitbucket.org/AAverin/jsutils/ | https://github.com/AAverin/JSUtilsサイズを四捨五入する Amir の方法を使用するhumanReadeableSizeメソッド がありますが、通常の基数 2 (KiB、MiB) と基数 10 の数値 (KB、MB) の間の変換もサポートしています。

最も近い値に切り捨てることができますが、必要に応じて切り上げることもできます。たとえば、PB での KB の量を取得できます。

自由に取得して、プロジェクトで使用してください。

于 2013-02-27T07:23:23.313 に答える