Saya mendapatkan kode ini untuk ukuran terselubung dalam byte melalui PHP.
Sekarang saya ingin mengonversi ukuran tersebut ke ukuran yang dapat dibaca manusia menggunakan JavaScript. Saya mencoba mengonversi kode ini ke JavaScript, yang terlihat seperti ini:
function formatSizeUnits(bytes){
if (bytes >= 1073741824) { bytes = (bytes / 1073741824).toFixed(2) + " GB"; }
else if (bytes >= 1048576) { bytes = (bytes / 1048576).toFixed(2) + " MB"; }
else if (bytes >= 1024) { bytes = (bytes / 1024).toFixed(2) + " KB"; }
else if (bytes > 1) { bytes = bytes + " bytes"; }
else if (bytes == 1) { bytes = bytes + " byte"; }
else { bytes = "0 bytes"; }
return bytes;
}
Apakah ini cara yang benar untuk melakukan ini? Apakah ada cara yang lebih mudah?
javascript
byte
converters
l2aelba
sumber
sumber
Jawaban:
Dari ini: ( sumber )
Catatan: Ini adalah kode asli, Silakan gunakan versi tetap di bawah ini. Aliceljm tidak lagi mengaktifkan kode yang disalinnya
Sekarang, Fixed versi tidak ditambang, dan ES6'ed: (oleh komunitas)
Sekarang, versi Tetap: (oleh komunitas Stackoverflow, + Diminimalkan oleh JSCompress )
Penggunaan:
Demo / sumber:
PS: Ubah
k = 1000
atausizes = ["..."]
seperti yang Anda inginkan ( bit atau byte )sumber
(bytes / Math.pow(1024, i)).toPrecision(3)
toFixed(n)
mungkin lebih tepat daripadatoPrecision(n)
memiliki presisi yang konsisten untuk semua nilai. Dan untuk menghindari trailing zero (ex:)bytesToSize(1000) // return "1.00 KB"
kita bisa menggunakanparseFloat(x)
. Saya sarankan untuk mengganti baris terakhir oleh:return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
. Dengan perubahan sebelumnya, hasilnya adalah:bytesToSize(1000) // return "1 KB"
/bytesToSize(1100) // return "1.1 KB"
/bytesToSize(1110) // return "1.11 KB
/bytesToSize(1111) // also return "1.11 KB"
sumber
Hasil:
sumber
Anda dapat menggunakan perpustakaan filesizejs .
sumber
Ada 2 cara nyata untuk merepresentasikan ukuran ketika dihubungkan dengan byte, yaitu satuan SI (10 ^ 3) atau satuan IEC (2 ^ 10). Ada juga JEDEC tetapi metode mereka ambigu dan membingungkan. Saya perhatikan contoh-contoh lain memiliki kesalahan seperti menggunakan KB dan bukan kB untuk mewakili satu kilobyte jadi saya memutuskan untuk menulis fungsi yang akan menyelesaikan masing-masing kasus menggunakan kisaran satuan ukuran yang saat ini diterima.
Ada sedikit format di akhir yang akan membuat angka terlihat sedikit lebih baik (setidaknya bagi saya) merasa bebas untuk menghapus format itu jika tidak sesuai dengan tujuan Anda.
Nikmati.
sumber
Inilah satu kalimat:
val => ['Bytes','Kb','Mb','Gb','Tb'][Math.floor(Math.log2(val)/10)]
Atau bahkan:
val => 'BKMGT'[~~(Math.log2(val)/10)]
sumber
val => 'BKMGT'[~~(Math.log10(val)/3)]
i = ~~(Math.log2(b)/10); return (b/Math.pow(1024,i)).toFixed(2) + ("KMGTPEZY"[i-1]||"") + "B"
Menggunakan operasi bitwise akan menjadi solusi yang lebih baik. Coba ini
sumber
Menurut jawaban Aliceljm , saya menghapus 0 setelah desimal:
sumber
Saya awalnya menggunakan jawaban @Aliceljm untuk proyek upload file yang sedang saya kerjakan, tetapi baru-baru ini mengalami masalah di mana file itu
0.98kb
tetapi sedang dibaca sebagai1.02mb
. Inilah kode yang diperbarui yang sekarang saya gunakan.Di atas kemudian akan dipanggil setelah file ditambahkan seperti itu
Memang, Windows membaca file sebagai
24.8mb
tetapi saya baik-baik saja dengan ketepatan ekstra.sumber
Solusi ini dibangun berdasarkan solusi sebelumnya, tetapi memperhitungkan satuan metrik dan biner:
Contoh:
sumber
sumber
sumber
Saya memperbarui jawaban @Aliceljm di sini. Karena tempat desimal penting untuk angka 1,2 digit, saya melengkapi tempat desimal pertama dan mempertahankan tempat desimal pertama. Untuk 3 digit angka, saya melengkapi tempat unit dan mengabaikan semua tempat desimal.
sumber
Beginilah seharusnya byte ditampilkan ke manusia:
sumber
Saya hanya ingin membagikan masukan saya. Saya punya masalah ini jadi solusi saya adalah ini. Ini akan mengkonversi unit yang lebih rendah ke unit yang lebih tinggi dan sebaliknya hanya memberikan argumen
toUnit
danfromUnit
Saya mendapat ide dari sini
sumber
sumber
byteVal >> 10
. Juga Anda akan lebih baik menggunakanMath.trunc()
untuk melemparkan bilangan real ke bilangan bulat daripada pembagian dengan 1.Coba solusi sederhana ini.
sumber