Mam ten kod do ukrytego rozmiaru w bajtach za pośrednictwem PHP.
Teraz chcę przekonwertować te rozmiary na rozmiary czytelne dla ludzi za pomocą JavaScript. Próbowałem przekonwertować ten kod na JavaScript, który wygląda następująco:
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;
}
Czy to właściwy sposób na zrobienie tego? Czy istnieje prostszy sposób?
javascript
byte
converters
L2aelba
źródło
źródło
Odpowiedzi:
Z tego: ( źródło )
Uwaga: jest to oryginalny kod, proszę użyć poprawionej wersji poniżej. Aliceljm nie aktywuje już skopiowanego kodu
Teraz, Naprawiono wersję nieuprawnioną i ES6'ed: (przez społeczność)
Teraz, Naprawiona wersja: (przez społeczność Stackoverflow, + Minified przez JSCompress )
Stosowanie :
Demo / źródło:
PS: Zmień
k = 1000
lubsizes = ["..."]
jak chcesz ( bity lub bajty )źródło
(bytes / Math.pow(1024, i)).toPrecision(3)
toFixed(n)
jest prawdopodobnie bardziej odpowiednie niżtoPrecision(n)
mieć stałą precyzję dla wszystkich wartości. Aby uniknąć końcowych zer (np .:)bytesToSize(1000) // return "1.00 KB"
, moglibyśmy użyćparseFloat(x)
. Proponuję zastąpić ostatnią linię przez:return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
. Po poprzedniej zmianie wyniki są następujące:bytesToSize(1000) // return "1 KB"
/bytesToSize(1100) // return "1.1 KB"
/bytesToSize(1110) // return "1.11 KB
/bytesToSize(1111) // also return "1.11 KB"
źródło
Wyniki:
źródło
Możesz użyć biblioteki filesizejs .
źródło
Istnieją 2 rzeczywiste sposoby przedstawiania rozmiarów w odniesieniu do bajtów, są to jednostki SI (10 ^ 3) lub IEC (2 ^ 10). Istnieje również JEDEC, ale ich metoda jest dwuznaczna i myląca. Zauważyłem, że w innych przykładach występują błędy, takie jak użycie KB zamiast kB do reprezentowania kilobajta, więc postanowiłem napisać funkcję, która rozwiąże każdy z tych przypadków przy użyciu zakresu obecnie akceptowanych jednostek miary.
Na końcu znajduje się bit formatujący, który sprawi, że liczba będzie wyglądać nieco lepiej (przynajmniej dla mojego oka), możesz usunąć to formatowanie, jeśli nie pasuje do twojego celu.
Cieszyć się.
źródło
Oto jeden liniowiec:
val => ['Bytes','Kb','Mb','Gb','Tb'][Math.floor(Math.log2(val)/10)]
Lub nawet:
val => 'BKMGT'[~~(Math.log2(val)/10)]
źródło
val => 'BKMGT'[~~(Math.log10(val)/3)]
i = ~~(Math.log2(b)/10); return (b/Math.pow(1024,i)).toFixed(2) + ("KMGTPEZY"[i-1]||"") + "B"
Lepszym rozwiązaniem byłoby użycie operacji bitowej. Spróbuj tego
źródło
Zgodnie z odpowiedzią Aliceljma usunąłem 0 po przecinku:
źródło
Pierwotnie użyłem odpowiedzi @Aliceljm dla projektu przesyłania pliku, nad którym pracowałem, ale ostatnio natknąłem się na problem polegający na tym, że plik był
0.98kb
odczytywany jako1.02mb
. Oto zaktualizowany kod, którego teraz używam.Powyższe zostanie następnie wywołane po dodaniu takiego pliku
To prawda, że Windows odczytuje plik jako istniejący,
24.8mb
ale jestem w porządku z dodatkową precyzją.źródło
To rozwiązanie opiera się na poprzednich rozwiązaniach, ale uwzględnia zarówno jednostki metryczne, jak i binarne:
Przykłady:
źródło
źródło
źródło
Aktualizuję odpowiedź @Aliceljm tutaj. Ponieważ miejsce dziesiętne ma znaczenie dla liczb 1,2-cyfrowych, zaokrąglam pierwsze miejsce po przecinku i zachowuję pierwsze miejsce po przecinku. Dla liczby 3-cyfrowej zaokrąglam miejsce jednostek i ignoruję wszystkie miejsca dziesiętne.
źródło
Oto jak bajt powinien być pokazany człowiekowi:
źródło
Chciałem tylko podzielić się swoimi opiniami. Miałem ten problem, więc moje rozwiązanie jest takie. Spowoduje to konwersję niższych jednostek na wyższe jednostki i odwrotnie, wystarczy podać argument
toUnit
ifromUnit
Stąd pomysł
źródło
źródło
byteVal >> 10
. Również byłoby lepiej wykorzystaćMath.trunc()
do oddania liczb rzeczywistych do liczb całkowitych zamiast ofdivision o 1.Wypróbuj to proste obejście.
źródło