Ich verwende diese Funktion, um eine Dateigröße in Bytes in eine für Menschen lesbare Dateigröße zu konvertieren:
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];
};
Es scheint jedoch, dass dies nicht 100% genau ist. Beispielsweise:
getReadableFileSizeString(1551859712); // output is "1.4 GB"
Sollte das nicht sein "1.5 GB"
? Es scheint, als ob die Division durch 1024 an Präzision verliert. Verstehe ich etwas völlig falsch oder gibt es einen besseren Weg, dies zu tun?
javascript
filesize
human-readable
Hristo
quelle
quelle
1.445281982421875
was richtig auf 1.4 abrundet.YB
. Zweifellos bekommt jemand sogar 1 YB für seine DB. Es wird 100 Billionen Dollar kosten !Antworten:
Dies hängt davon ab, ob Sie die Binär- oder Dezimalkonvention verwenden möchten.
RAM wird zum Beispiel immer binär gemessen, daher wäre es korrekt, 1551859712 als ~ 1,4 GB auszudrücken.
Auf der anderen Seite verwenden Festplattenhersteller gerne Dezimalzahlen, so dass sie es ~ 1,6 GB nennen würden.
Und nur um verwirrend zu sein, verwenden Disketten eine Mischung aus beiden Systemen - ihre 1 MB sind tatsächlich 1024000 Bytes.
quelle
Hier ist eine, die ich geschrieben habe:
quelle
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]}
Eine weitere Ausführungsform der Berechnung
quelle
var i = size == 0 ? 0 : Math.floor( Math.log(size) / Math.log(1024) );
scheint den Trick zu tun, wenn es 0 ist. Es wird "0 B" zurückgegeben.toFixed
und dann mit einer Zeichenfolge* 1
*1
ändert den Datentyp von Zeichenfolge zu Zahl, also für den Wert1024
Sie1 kB
anstelle von erhalten1.00 kB
. Sie können TypeScript glücklich machen, indem SieNumber((size / Math.pow(1024, i)).toFixed(2))
dasselbe tun.Hier ist ein Prototyp, um eine Zahl in eine lesbare Zeichenfolge umzuwandeln, die den neuen internationalen Standards entspricht.
https://wiki.ubuntu.com/UnitsPolicy
http://en.wikipedia.org/wiki/Template:Quantities_of_bytes
Diese Funktion enthält no
loop
und ist daher wahrscheinlich schneller als einige andere Funktionen.Verwendung:
IEC-Präfix
SI-Präfix
Ich habe die IEC als Standard festgelegt, weil ich immer den Binärmodus verwendet habe, um die Größe einer Datei zu berechnen ... mit der Leistung von 1024
Wenn Sie nur eine davon in einer kurzen Oneliner-Funktion haben möchten:
SI
IEC
Verwendung:
Wenn Sie Fragen zu den Funktionen haben, fragen Sie einfach
quelle
.toFixed(e ? 2 : 0)
quelle
\u200b
:'\u200bKMGTP'
.Lösung als ReactJS-Komponente
UPDATE Für diejenigen, die es6 verwenden, ist hier eine zustandslose Version derselben Komponente
quelle
${(bytes / (1024 ** i)).toFixed(2)} ${suffixes[i]}
;;Basierend auf der Idee von cocco ist hier ein weniger kompaktes - aber hoffentlich umfassenderes - Beispiel.
quelle
Ich wollte das Verhalten "Dateimanager" (z. B. Windows Explorer), bei dem die Anzahl der Dezimalstellen proportional zur Anzahl der Zahlen ist. Anscheinend tut dies keine der anderen Antworten.
Hier einige Beispiele:
quelle
+num.tofixed(2)
.toPrecision(3)
nicht alle diese Fälle ab? Oh ... ich denke, es deckt nicht zwischen 1000 und 1023 ab. Schade.Ein weiteres Beispiel ähnlich dem hier
Es misst eine vernachlässigbar bessere Leistung als die anderen mit ähnlichen Merkmalen.
quelle
Hier ist meins - funktioniert auch für wirklich große Dateien -_-
quelle
Basierend auf der Antwort von cocco, aber leicht desugerifiziert (ehrlich gesagt, werden diejenigen, mit denen ich mich wohl gefühlt habe, beibehalten / hinzugefügt) und zeigen keine nachgestellten Nullen, unterstützen aber immer noch 0, hoffen, für andere nützlich zu sein:
quelle
Ihre Lösung ist richtig. Es ist wichtig zu wissen, dass Sie, um von
1551859712
nach zu gelangen1.5
, durch 1000 dividieren müssen. Die Bytes werden jedoch in Binär-Dezimal-Blöcken von 1024 gezählt, weshalb der Gigabyte-Wert geringer ist.quelle
Ich fand die Antwort von @ cocco interessant, hatte aber folgende Probleme:
Typoskript:
quelle
Dies ist eine Größenverbesserung der mpen-Antwort
Code-Snippet anzeigen
quelle
Für diejenigen, die verwenden
Angular
, gibt es ein Paket namensangular-pipes
, das eine Pipe dafür hat:Datei
Verwendung
Link zu den Dokumenten .
quelle
Meine Antwort könnte spät sein, aber ich denke, es wird jemandem helfen.
Metrisches Präfix:
Binäres Präfix:
Beispiele:
quelle
let bytes = 1024 * 10 * 10 * 10;
console.log (getReadableFileSizeString (Bytes))
gibt 1000.0Кб anstelle von 1MB zurück
quelle