Skenario: ukuran berbagai file disimpan dalam database sebagai byte. Apa cara terbaik untuk memformat info ukuran ini ke kilobyte, megabita dan gigabita? Misalnya saya punya MP3 yang Ubuntu tampilkan sebagai "5,2 MB (5445632 bytes)". Bagaimana saya menampilkan ini di halaman web sebagai "5,2 MB" DAN memiliki file kurang dari satu megabyte sebagai KB dan file satu gigabyte dan di atas ditampilkan sebagai GB?
184
Jawaban:
(Diambil dari php.net , ada banyak contoh lain di sana, tapi saya suka yang terbaik ini :-)
sumber
$bytes /= (1 << (10 * $pow))
atau sejenisnya, saya bisa menyukainya lebih baik. :-PKiB
,MiB
,GiB
danTiB
karena Anda membagi dengan1024
. Jika Anda dibagi dengan1000
itu akan tanpai
.Uncomment one of the following alternatives
adalah sesuatu yang saya tidak perhatikan selama 5 menit ...Ini adalah implementasi Chris Jester-Young, terbersih yang pernah saya lihat, dikombinasikan dengan php.net dan argumen presisi.
sumber
$suffixes = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
Saya ingin hard drive Yottabyte! :-PformatBytes(259748192, 3)
mengembalikan259748192 MB
yang tidak benarKodesemu:
sumber
Ini adalah implementasi Kohana , Anda bisa menggunakannya:
sumber
$force_unit
dan$si
sepertinya melakukan hal yang sama. Anda juga dapat meneruskan string apa pun dengan "i" di dalamnya$force_unit
, karena mereka menguji posisi. Pemformatan desimal juga berlebihan.Cukup bagi dengan 1024 untuk kb, 1024 ^ 2 untuk mb dan 1024 ^ 3 untuk GB. Sesimpel itu.
sumber
Hanya alternatif saya, pendek dan bersih:
atau, lebih bodoh dan efisien:
sumber
gunakan fungsi ini jika Anda menginginkan kode pendek
bcdiv ()
sumber
Saya tahu mungkin agak terlambat untuk menjawab pertanyaan ini, tetapi lebih banyak data tidak akan membunuh seseorang. Inilah fungsi yang sangat cepat:
EDIT: Saya memperbarui posting saya untuk memasukkan perbaikan yang diusulkan oleh camomileCase:
sumber
Fungsi sederhana
sumber
Solusi fleksibel:
sumber
Saya berhasil dengan fungsi berikut,
sumber
Pendekatan saya
sumber
Saya tidak tahu mengapa Anda harus membuatnya begitu rumit seperti yang lain.
Kode berikut jauh lebih sederhana untuk dipahami dan sekitar 25% lebih cepat daripada solusi lain yang menggunakan fungsi log (disebut fungsi 20 Mio. kali dengan parameter yang berbeda)
sumber
Saya melakukan ini mengubah semua input ke byte dan mengkonversi ke setiap output yang dibutuhkan. Juga, saya menggunakan fungsi bantu untuk mendapatkan basis 1000 atau 1024, tetapi membiarkannya memutuskan untuk menggunakan 1024 pada tipe populer (tanpa 'i', seperti MB, bukan MiB).
sumber
coba ini ;)
sumber
sumber
Panggil saja fungsinya
sumber
Ini bekerja dengan PHP terakhir
sumber
Meskipun agak basi, pustaka ini menawarkan API konversi yang teruji dan kuat:
https://github.com/gabrielelana/byte-units
Setelah diinstal:
Dan untuk mengkonversi ke arah lain:
Di luar konversi dasar, ia menawarkan metode untuk penambahan, pengurangan, perbandingan, dll.
Saya sama sekali tidak berafiliasi dengan perpustakaan ini.
sumber
sumber
Berikut adalah implementasi fungsi Drupal format_size yang disederhanakan :
sumber
Ini sedikit terlambat tetapi versi yang sedikit lebih cepat dari jawaban yang diterima ada di bawah ini:
Ini lebih efisien, karena melakukan operasi log-2 tunggal dan bukan dua operasi log-e.
Namun sebenarnya lebih cepat untuk melakukan solusi yang lebih jelas di bawah ini:
Ini karena indeks dihitung pada saat yang sama dengan nilai jumlah byte pada unit yang sesuai. Ini memangkas waktu eksekusi sekitar 35% (peningkatan kecepatan 55%).
sumber
Implementasi kental lain yang dapat menerjemahkan ke basis 1024 (biner) atau basis 1000 (desimal) dan juga bekerja dengan angka yang sangat besar karena penggunaan perpustakaan bc:
sumber
bcpow()
akan mengeluarkan pengecualian TypeError jika$base
dan$i
bukan nilai string. Diuji pada PHP versi 7.0.11.Saya pikir saya akan menambahkan dua kode submitter (Menggunakan kode John Himmelman, yang ada di utas ini, dan menggunakan kode Eugene Kuzmenko ) yang saya gunakan.
Ini menggunakan kode Eugene untuk memformat
$value
menjadi byte (saya menyimpan data saya di MB, jadi itu mengubah data saya:10485760 MB
menjadi10995116277760
) - kemudian menggunakan kode John untuk mengubahnya menjadi nilai tampilan yang tepat (10995116277760
ke10 TB
).Saya telah menemukan ini sangat membantu - jadi terima kasih saya kepada dua submitter!
sumber
Fungsi yang sangat sederhana untuk mendapatkan ukuran file manusia.
Sumber asli: http://php.net/manual/de/function.filesize.php#106569
Salin / tempel kode:
sumber
Saya mengembangkan fungsi saya sendiri yang mengubah ukuran memori yang dapat dibaca manusia menjadi ukuran yang berbeda.
Fungsi ini menerima singkatan ukuran memori apa pun seperti "Megabyte, MB, Mb, mb, m, kilobyte, K, KB, b, Terabyte, T ...." sehingga aman untuk kesalahan ketik.
sumber
Berdasarkan jawaban Leo , tambahkan
Jika Anda ingin unit maks ke Mega, ubah ke
$units = explode(' ', ' K M');
sumber