人間の読み取り可能な値に対する実際の数字
-
12-10-2019 - |
質問
バイトのデータがあります。この値は、チャート(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]
}
}
解決
私はこの実装が大好きです:明確でコンパクト:
function readablizeBytes(bytes) {
var s = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'];
var e = Math.floor(Math.log(bytes) / Math.log(1024));
return (bytes / Math.pow(1024, e)).toFixed(2) + " " + s[e];
}
使用法:
readablizeBytes(10000000)
"9.54 MB"
私はこれの信用を取得していません。
他のヒント
これが私が使用するものです。最寄りのユニットまで丸められるため、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';
}
おそらくこのようなもの?
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
ブールでした - あなたが最も適したものに変えてください。
Amer'sの修正バージョン:
(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サフィックス
- 標準以外の接尾辞はありません
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
私は上位2つのソリューションの中で最高のと感じたものを取り、これを思いついたのは、最初のソリューションよりも速く、2番目のソリューションよりも遅くなりました。しかし、その目的は、ラウンドではなく、常に正確に3文字を持つことです。 3文字の制限の理由は、配置されていたコンテナのサイズの制約によるものでした。さらに、それを使用して以外の2つの数値をフォーマットする必要がある場合、必要なのはKiloを1000に変更するだけです。
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;
};
あなたの回答は本当に私を助けてくれたので、私はこのサイズのフォーマットのこの問題を完全に解決するユーティリティ方法を書くことにしました。
私のjsutilsレポジンのwikiページをチェックしてください: https://bitbucket.org/aaverin/jsutils/ | https://github.com/aaverin/jsutils持っています HumanReadeAblesize Amirのサイズを丸める方法を使用しますが、通常の2(KIB、MIB)とベース10の数値(KB、MB)の間の変換もサポートします。
それは最も近い値に締めくくることができますが、たとえば、あなたが望む場合に備えて、PBのKBの量を取得することもできます。
自由につかんで、プロジェクトで使用してください!
number_to_human_size(number、options = {})を使用できます
number_to_human_size(1234567)
例:
number_to_human_size(123) # => 123 Bytes
number_to_human_size(1234) # => 1.21 KB
number_to_human_size(12345) # => 12.1 KB
number_to_human_size(1234567) # => 1.18 MB
number_to_human_size(1234567890) # => 1.15 GB
number_to_human_size(1234567890123) # => 1.12 TB
number_to_human_size(1234567, precision: 2) # => 1.2 MB
number_to_human_size(483989, precision: 2) # => 470 KB
number_to_human_size(1234567, precision: 2, separator: ',') # => 1,2 MB