Saya menggunakan fungsi ini untuk mengonversi ukuran file dalam byte ke ukuran file yang dapat dibaca manusia:
function getReadableFileSizeString(fileSizeInBytes) {
var i = -1;
var byteUnits = [' kB', ' MB', ' GB', ' TB', 'PB', 'EB', 'ZB', 'YB'];
do {
fileSizeInBytes = fileSizeInBytes / 1024;
i++;
} while (fileSizeInBytes > 1024);
return Math.max(fileSizeInBytes, 0.1).toFixed(1) + byteUnits[i];
};
Namun, sepertinya ini tidak 100% akurat. Sebagai contoh:
getReadableFileSizeString(1551859712); // output is "1.4 GB"
Bukankah ini seharusnya "1.5 GB"
? Sepertinya pembagian pada tahun 1024 kehilangan presisi. Apakah saya benar-benar salah memahami sesuatu atau ada cara yang lebih baik untuk melakukan ini?
javascript
filesize
human-readable
Hristo
sumber
sumber
1.445281982421875
yang dibulatkan dengan benar ke 1.4.YB
. Siapa pun yang ragu akan mendapatkan 1 YB untuk DB-nya. Itu akan menelan biaya 100 triliun dolar !Jawaban:
Itu tergantung pada apakah Anda ingin menggunakan konvensi biner atau desimal.
RAM, misalnya, selalu diukur dalam biner, sehingga untuk mengekspresikan 1551859712 sebagai ~ 1.4GiB akan benar.
Di sisi lain, produsen hard disk suka menggunakan desimal, sehingga mereka menyebutnya ~ 1,6GB.
Dan hanya untuk membingungkan, floppy disk menggunakan campuran kedua sistem - 1MB mereka sebenarnya 1024000 byte.
sumber
Inilah yang saya tulis:
sumber
function humanFileSize(B,i){var e=i?1e3:1024;if(Math.abs(B)<e)return B+" B";var a=i?["kB","MB","GB","TB","PB","EB","ZB","YB"]:["KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"],t=-1;do B/=e,++t;while(Math.abs(B)>=e&&t<a.length-1);return B.toFixed(1)+" "+a[t]}
Perwujudan lain dari perhitungan
sumber
var i = size == 0 ? 0 : Math.floor( Math.log(size) / Math.log(1024) );
tampaknya melakukan trik jika 0. Ini akan mengembalikan "0 B".toFixed
dan kemudian melakukan matematika dengan string. Apa fungsinya* 1
?*1
mengubah tipe data dari string ke nomor, jadi untuk nilai1024
yang Anda dapatkan1 kB
bukan1.00 kB
. Anda dapat membuat TypeScript bahagia dengan melakukanNumber((size / Math.pow(1024, i)).toFixed(2))
untuk mencapai hal yang sama.Berikut adalah prototipe untuk mengonversi angka menjadi string yang dapat dibaca sehubungan dengan standar internasional baru.
https://wiki.ubuntu.com/UnitsPolicy
http://en.wikipedia.org/wiki/Template:Quantities_of_bytes
Fungsi ini mengandung no
loop
, jadi mungkin lebih cepat dari beberapa fungsi lainnya.Pemakaian:
Awalan IEC
Awalan SI
Saya menetapkan IEC sebagai default karena saya selalu menggunakan mode biner untuk menghitung ukuran file ... menggunakan kekuatan 1024
Jika Anda hanya ingin salah satu dari mereka dalam fungsi oneliner pendek:
SI
IEC
Pemakaian:
jika Anda memiliki beberapa pertanyaan tentang fungsi, tanyakan saja
sumber
.toFixed(e ? 2 : 0)
sumber
\u200b
:'\u200bKMGTP'
.Solusi sebagai Komponen ReactJS
PEMBARUAN Bagi mereka yang menggunakan es6 di sini adalah versi stateless dari komponen yang sama ini
sumber
${(bytes / (1024 ** i)).toFixed(2)} ${suffixes[i]}
;Berdasarkan ide cocco , ini contoh yang kurang kompak - tapi semoga lebih komprehensif - contoh.
sumber
Saya ingin perilaku "manajer file" (misalnya, Windows Explorer) di mana jumlah tempat desimal sebanding dengan ukuran angka. Tampaknya tidak ada jawaban lain yang melakukan ini.
Inilah beberapa contoh:
sumber
+num.tofixed(2)
.toPrecision(3)
mencakup semua kasus ini? Oh .. Saya kira itu tidak mencakup antara 1000 dan 1023. Nyebelin.Contoh lain mirip dengan yang ada di sini
Ini mengukur kinerja yang jauh lebih baik daripada yang lain dengan fitur serupa.
sumber
Ini milik saya - berfungsi untuk file yang sangat besar juga -_-
sumber
Berdasarkan jawaban cocco tetapi sedikit desugerified (jujur, yang saya merasa nyaman tetap ada / ditambahkan) dan tidak menunjukkan angka nol tetapi masih mendukung 0, berharap bermanfaat bagi orang lain:
sumber
Solusi Anda benar. Hal penting yang harus disadari adalah bahwa untuk beralih dari
1551859712
ke1.5
, Anda harus melakukan pembagian dengan 1000, tetapi byte dihitung dalam potongan biner-ke-desimal 1024, maka mengapa nilai Gigabyte lebih kecil.sumber
Saya menemukan jawaban @ cocco menarik, tetapi memiliki masalah berikut ini:
TypeScript:
sumber
Ini adalah peningkatan ukuran jawaban mpen
Tampilkan cuplikan kode
sumber
Bagi yang menggunakan
Angular
, ada paket bernamaangular-pipes
yang memiliki pipa untuk ini:Mengajukan
Pemakaian
Tautan ke dokumen .
sumber
Jawaban saya mungkin terlambat, tapi saya kira itu akan membantu seseorang.
Awalan metrik:
Awalan biner:
Contoh:
sumber
biarkan byte = 1024 * 10 * 10 * 10;
console.log (getReadableFileSizeString (bytes))
akan mengembalikan 1000.0Кб sebagai ganti 1MB
sumber