Scenariusz: rozmiar różnych plików jest przechowywany w bazie danych jako bajty. Jaki jest najlepszy sposób sformatowania informacji o rozmiarze na kilobajty, megabajty i gigabajty? Na przykład mam plik MP3, który Ubuntu wyświetla jako „5,2 MB (5445632 bajtów)”. Jak wyświetlić to na stronie internetowej jako „5,2 MB” ORAZ pliki o rozmiarze mniejszym niż jeden megabajt wyświetlane jako KB, a pliki o rozmiarze jednego gigabajta i więcej wyświetlane jako GB?
184
Odpowiedzi:
(Zaczerpnięte z php.net , istnieje wiele innych przykładów, ale ten najbardziej mi się podoba :-)
źródło
$bytes /= (1 << (10 * $pow))
lub podobnego, mógłbym polubić to lepiej. :-PKiB
,MiB
,GiB
aTiB
ponieważ jesteś dzielenie przez1024
. Jeśli podzielisz1000
to, nie byłobyi
.Uncomment one of the following alternatives
było coś, czego nie zauważyłem przez 5 minut ...To jest implementacja Chrisa Jester-Younga, najczystsza, jaką kiedykolwiek widziałem, w połączeniu z php.net i precyzyjnym argumentem.
źródło
$suffixes = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
Chcę dysku twardego Yottabyte! :-PformatBytes(259748192, 3)
zwraca,259748192 MB
co jest nie takPseudo kod:
źródło
To jest implementacja Kohany , możesz jej użyć:
źródło
$force_unit
i$si
wydaje się, że robią to samo. Możesz również przekazać dowolny ciąg znaków z literą „i”$force_unit
, ponieważ sprawdzają one pozycję. Formatowanie dziesiętne jest również nadmierne.Po prostu podziel go przez 1024 dla KB, 1024 ^ 2 dla MB i 1024 ^ 3 dla GB. Tak proste jak to.
źródło
Tylko moja alternatywa, krótka i czysta:
lub bardziej głupi i skuteczny:
źródło
użyj tej funkcji, jeśli chcesz uzyskać krótki kod
bcdiv ()
źródło
Wiem, że może trochę za późno odpowiedzieć na to pytanie, ale więcej danych nie zabije kogoś. Oto bardzo szybka funkcja:
EDYCJA: Zaktualizowałem swój post, aby uwzględnić poprawkę zaproponowaną przez camomileCase:
źródło
Prosta funkcja
źródło
Elastyczne rozwiązanie:
źródło
Udało mi się z następującą funkcją,
źródło
Moje podejście
źródło
Nie wiem, dlaczego miałbyś to tak skomplikować jak inni.
Poniższy kod jest znacznie prostszy do zrozumienia i około 25% szybszy niż inne rozwiązania korzystające z funkcji dziennika (zwanej funkcją 20 milionów razy z różnymi parametrami)
źródło
Zrobiłem to, konwertując wszystkie dane wejściowe na bajty, a więc konwertując na wszelkie potrzebne dane wyjściowe. Ponadto użyłem funkcji pomocniczej, aby uzyskać bazę 1000 lub 1024, ale pozostawiłem flex, aby zdecydować się na użycie 1024 na popularnym typie (bez „i”, jak MB zamiast MiB).
źródło
Spróbuj tego ;)
źródło
źródło
Wystarczy wywołać funkcję
źródło
Działa z ostatnim PHP
źródło
Chociaż nieco przestarzała, ta biblioteka oferuje przetestowany i solidny interfejs API do konwersji:
https://github.com/gabrielelana/byte-units
Po zainstalowaniu:
I przekonwertować w innym kierunku:
Oprócz podstawowej konwersji oferuje metody dodawania, odejmowania, porównywania itp.
Nie jestem w żaden sposób związany z tą biblioteką.
źródło
źródło
Oto uproszczona implementacja funkcji format_size Drupala :
źródło
Jest trochę późno, ale nieco szybsza wersja zaakceptowanej odpowiedzi znajduje się poniżej:
Jest bardziej wydajny, ponieważ wykonuje jedną operację log-2 zamiast dwóch operacji log-e.
W rzeczywistości szybsze jest wykonanie bardziej oczywistego rozwiązania poniżej:
Wynika to z faktu, że ponieważ indeks jest obliczany w tym samym czasie, co wartość liczby bajtów w odpowiedniej jednostce. Skróciło to czas wykonania o około 35% (wzrost prędkości o 55%).
źródło
Inna skrócona implementacja, która może tłumaczyć na podstawową 1024 (binarną) lub podstawową 1000 (dziesiętną), a także działa z niewiarygodnie dużymi liczbami, stąd użycie biblioteki bc:
źródło
bcpow()
rzuci TypeError wyjątek, jeśli$base
i$i
nie są ciągi znaków. Testowane na PHP w wersji 7.0.11.Pomyślałem, że dodam siatkę dwóch kodów przesyłających (Używając kodu Johna Himmelmana, który jest w tym wątku i używam kodu Eugene'a Kuźmenki ), którego używam.
Używa kodu Eugene'a do formatowania
$value
bajtów (zachowuję moje dane w MB, więc konwertuje moje dane:10485760 MB
na10995116277760
) - następnie używa kodu Johna, aby przekonwertować go na odpowiednią wartość wyświetlania (10995116277760
na10 TB
).Uważam to za bardzo pomocne - więc dziękuję dwóm autorom!
źródło
Niezwykle prosta funkcja pozwalająca uzyskać rozmiar pliku ludzkiego.
Oryginalne źródło: http://php.net/manual/de/function.filesize.php#106569
Skopiuj / wklej kod:
źródło
Opracowałem własną funkcję, która przekształca rozmiar pamięci czytelnej dla człowieka na różne rozmiary.
Ta funkcja akceptuje dowolny skrót wielkości pamięci, taki jak „Megabajt, MB, Mb, mb, m, kilobajt, K, KB, b, Terabajt, T ....”, więc jest bezpieczny.
źródło
W oparciu o odpowiedź Leo , dodać
Jeśli chcesz, aby maksymalna jednostka wynosiła Mega, zmień na
$units = explode(' ', ' K M');
źródło