Ich habe diesen Code bekommen, um die Größe in Bytes über PHP zu verbergen.
Jetzt möchte ich diese Größen mit JavaScript in lesbare Größen konvertieren . Ich habe versucht, diesen Code in JavaScript zu konvertieren. Das sieht folgendermaßen aus:
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;
}
Ist das der richtige Weg, dies zu tun? Gibt es einen einfacheren Weg?
javascript
byte
converters
l2aelba
quelle
quelle
Antworten:
Daraus: ( Quelle )
Hinweis: Dies ist der Originalcode. Bitte verwenden Sie die unten stehende feste Version. Aliceljm aktiviert ihren kopierten Code nicht mehr
Jetzt wurde die feste Version nicht minimiert und ES6'ed: (von der Community)
Jetzt feste Version: (von Stackoverflows Community, + von JSCompress minimiert )
Verwendung :
Demo / Quelle:
PS: Ändern
k = 1000
odersizes = ["..."]
wie Sie wollen ( Bits oder Bytes )quelle
(bytes / Math.pow(1024, i)).toPrecision(3)
toFixed(n)
ist wahrscheinlich angemessener alstoPrecision(n)
eine konsistente Genauigkeit für alle Werte zu haben. Und um nachgestellte Nullen (zB :) zu vermeiden,bytesToSize(1000) // return "1.00 KB"
könnten wir verwendenparseFloat(x)
. Ich schlage vor, die letzte Zeile durch zu ersetzen :return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
. Mit der vorherigen Änderung sind die Ergebnisse:bytesToSize(1000) // return "1 KB"
/bytesToSize(1100) // return "1.1 KB"
/bytesToSize(1110) // return "1.11 KB
/bytesToSize(1111) // also return "1.11 KB"
quelle
Ergebnisse:
quelle
Sie können die Datei filesizejs verwenden.
quelle
Es gibt zwei reale Möglichkeiten, Größen in Bezug auf Bytes darzustellen: SI-Einheiten (10 ^ 3) oder IEC-Einheiten (2 ^ 10). Es gibt auch JEDEC, aber ihre Methode ist mehrdeutig und verwirrend. Ich habe festgestellt, dass die anderen Beispiele Fehler aufweisen, z. B. die Verwendung von KB anstelle von kB zur Darstellung eines Kilobytes. Daher habe ich beschlossen, eine Funktion zu schreiben, die jeden dieser Fälle anhand des Bereichs der derzeit akzeptierten Maßeinheiten löst.
Am Ende befindet sich ein Formatierungsbit, mit dem die Zahl ein bisschen besser aussieht (zumindest für mein Auge). Sie können diese Formatierung jederzeit entfernen, wenn sie nicht Ihrem Zweck entspricht.
Genießen.
quelle
Hier ist ein Einzeiler:
val => ['Bytes','Kb','Mb','Gb','Tb'][Math.floor(Math.log2(val)/10)]
Oder auch:
val => 'BKMGT'[~~(Math.log2(val)/10)]
quelle
val => 'BKMGT'[~~(Math.log10(val)/3)]
i = ~~(Math.log2(b)/10); return (b/Math.pow(1024,i)).toFixed(2) + ("KMGTPEZY"[i-1]||"") + "B"
Die bitweise Operation wäre eine bessere Lösung. Versuche dies
quelle
Nach Aliceljms Antwort habe ich 0 nach der Dezimalstelle entfernt:
quelle
Ich habe ursprünglich die Antwort von @Aliceljm für ein Datei-Upload-Projekt verwendet, an dem ich gearbeitet habe, bin aber kürzlich auf ein Problem gestoßen , bei dem eine Datei
0.98kb
nur als gelesen wurde1.02mb
. Hier ist der aktualisierte Code, den ich jetzt verwende.Das Obige würde dann aufgerufen, nachdem eine Datei wie folgt hinzugefügt wurde
Zugegeben, Windows liest die Datei als solche,
24.8mb
aber ich bin mit der zusätzlichen Präzision einverstanden.quelle
Diese Lösung baut auf früheren Lösungen auf, berücksichtigt jedoch sowohl metrische als auch binäre Einheiten:
Beispiele:
quelle
quelle
quelle
Ich aktualisiere @Aliceljm Antwort hier. Da die Dezimalstelle für 1,2-stellige Zahlen wichtig ist, runde ich die erste Dezimalstelle ab und behalte die erste Dezimalstelle. Bei einer dreistelligen Zahl runde ich die Einheitsstelle ab und ignoriere alle Dezimalstellen.
quelle
So sollte einem Menschen ein Byte gezeigt werden:
quelle
Ich wollte nur meine Beiträge teilen. Ich hatte dieses Problem, also ist meine Lösung dies. Dadurch werden niedrigere Einheiten in höhere Einheiten umgewandelt und umgekehrt nur das Argument
toUnit
undfromUnit
Ich habe die Idee von hier
quelle
quelle
byteVal >> 10
. Auch würden Sie besser nutzenMath.trunc()
reelle Zahlen auf ganze Zahlen zu werfen , anstatt ofdivision von 1.Versuchen Sie diese einfache Problemumgehung.
quelle