Korzystam z tej funkcji, aby przekonwertować rozmiar pliku w bajtach na rozmiar pliku czytelny dla człowieka:
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];
};
Wydaje się jednak, że nie jest to w 100% dokładne. Na przykład:
getReadableFileSizeString(1551859712); // output is "1.4 GB"
Nie powinno tak być "1.5 GB"
? Wygląda na to, że podział przez 1024 traci precyzję. Czy całkowicie coś rozumiem, czy jest na to lepszy sposób?
javascript
filesize
human-readable
Hristo
źródło
źródło
1.445281982421875
co poprawnie zaokrągla w dół do 1,4.YB
. Wątpliwy, każdy dostanie nawet 1 YB za swoją DB. Kosztuje 100 bilionów dolarów !Odpowiedzi:
Zależy to od tego, czy chcesz użyć konwencji binarnej czy dziesiętnej.
Na przykład pamięć RAM jest zawsze mierzona w systemie binarnym, więc wyrażenie 1551859712 jako ~ 1,4GiB byłoby poprawne.
Z drugiej strony producenci dysków twardych lubią używać dziesiętnych, więc nazwaliby to ~ 1,6 GB.
Aby się pomylić, dyskietki wykorzystują mieszankę dwóch systemów - ich 1 MB to w rzeczywistości 1024000 bajtów.
źródło
Oto jeden napisałem:
źródło
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]}
Kolejny przykład wykonania obliczeń
źródło
var i = size == 0 ? 0 : Math.floor( Math.log(size) / Math.log(1024) );
wydaje się załatwić sprawę, jeśli ma wartość 0. Zwróci „0 B”.toFixed
a potem robisz matematykę za pomocą łańcucha. Co robi* 1
?*1
Zmienia typ danych z napisu na numer, więc dla wartości1024
można dostać1 kB
zamiast1.00 kB
. Możesz uszczęśliwić TypeScript, robiącNumber((size / Math.pow(1024, i)).toFixed(2))
to samo.Oto prototyp służący do konwersji liczby na czytelny ciąg zgodny z nowymi standardami międzynarodowymi.
https://wiki.ubuntu.com/UnitsPolicy
http://en.wikipedia.org/wiki/Template:Quantities_of_bytes
Ta funkcja nie zawiera
loop
, a więc jest prawdopodobnie szybsza niż niektóre inne funkcje.Stosowanie:
Prefiks IEC
Prefiks SI
ustawiłem IEC jako domyślny, ponieważ zawsze korzystałem z trybu binarnego, aby obliczyć rozmiar pliku ... używając mocy 1024
Jeśli chcesz tylko jeden z nich w krótkiej funkcji oneliner:
SI
IEC
Stosowanie:
jeśli masz jakieś pytania dotyczące funkcji, po prostu zapytaj
źródło
.toFixed(e ? 2 : 0)
źródło
\u200b
:'\u200bKMGTP'
.Rozwiązanie jako komponent ReactJS
AKTUALIZACJA Dla osób używających es6 tutaj jest wersja bezstanowa tego samego komponentu
źródło
${(bytes / (1024 ** i)).toFixed(2)} ${suffixes[i]}
;Oparty na pomyśle Cocco , oto mniej zwarty - ale mam nadzieję, że bardziej wyczerpujący przykład.
źródło
Chciałem zachowania „menedżera plików” (np. Eksploratora Windows), w którym liczba miejsc dziesiętnych jest proporcjonalna do wielkości liczbowej. Niby żadna inna odpowiedź tego nie robi.
Oto kilka przykładów:
źródło
+num.tofixed(2)
.toPrecision(3)
obejmuje wszystkich tych przypadków? Och .. Chyba nie obejmuje od 1000 do 1023. Bummer.Kolejny przykład podobny do tych tutaj
Mierzy pomijalnie lepszą wydajność niż inne z podobnymi funkcjami.
źródło
Oto moje - działa również na naprawdę duże pliki -_-
źródło
Oparty na odpowiedzi Cocco, ale nieco pozbawiony zera (szczerze mówiąc, te, z którymi czułem się komfortowo, zostały / zostały dodane) i nie pokazuje końcowych zer, ale nadal obsługuje 0, mam nadzieję, że będą przydatne dla innych:
źródło
Twoje rozwiązanie jest poprawne. Ważną rzeczą do zrozumienia jest to, że aby dostać się
1551859712
do1.5
, musisz wykonać podział przez 1000, ale bajty są liczone w liczbach binarnych do dziesiętnych po 1024, dlatego wartość Gigabajtów jest mniejsza.źródło
Uważam, że odpowiedź @ cocco jest interesująca, ale miałem z nią następujące problemy:
Maszynopis:
źródło
To jest poprawa rozmiaru odpowiedzi mpen
Pokaż fragment kodu
źródło
Dla tych, którzy używają
Angular
, istnieje pakiet o nazwie,angular-pipes
który ma potok do tego:Plik
Stosowanie
Link do dokumentów .
źródło
Moja odpowiedź może się spóźnić, ale chyba komuś to pomoże.
Prefiks metryczny:
Prefiks binarny:
Przykłady:
źródło
niech bajty = 1024 * 10 * 10 * 10;
console.log (getReadableFileSizeString (bytes))
zwróci 1000,0Кб zamiast 1MB
źródło