Konvertieren der Dateigröße in Bytes in eine für Menschen lesbare Zeichenfolge

239

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?

Hristo
quelle
3
getReadableFileSizeString (0); gibt 0,1 kb zurück; p
Daniel Magnusson
2
Warum sollte es 1,5 sein? Es ist das, 1.445281982421875was richtig auf 1.4 abrundet.
Mpen
1
1551859712 / (1024 ^ 3) = 1.445281982421875 was richtig ist!
HM
2
Ich liebe es, dass du hinzugefügt hast YB. Zweifellos bekommt jemand sogar 1 YB für seine DB. Es wird 100 Billionen Dollar kosten !
Guyarad
4
@guyarad - Es gibt ein berühmtes Bild einer 5-MB-Festplatte von vor 50 Jahren (hatte die Größe eines Raums und wog ungefähr eine Tonne). Ich bin mir sicher, dass sie damals nicht einmal von GB und TB geträumt haben und schauen, wo wir heute sind ... sag niemals nie ;-)
TheCuBeMan

Antworten:

45

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.

Neil
quelle
3
Abendessen lustig ;-) "Nur um verwirrend zu sein, verwenden Disketten eine Mischung aus beiden Systemen - ihre 1 MB sind tatsächlich 1024000 Bytes."
FranXho
Richtig, RAM-Größen werden mit IEC-Einheiten gemessen, Festplattengrößen mit Metrik. Es gibt ein isomorphes npm-Modul, mit dem beide konvertiert werden können: Byte-Größe
Lloyd
351

Hier ist eine, die ich geschrieben habe:

function humanFileSize(bytes, si=false, dp=1) {
  const thresh = si ? 1000 : 1024;

  if (Math.abs(bytes) < thresh) {
    return bytes + ' B';
  }

  const units = si 
    ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] 
    : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
  let u = -1;
  const r = 10**dp;

  do {
    bytes /= thresh;
    ++u;
  } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1);


  return bytes.toFixed(dp) + ' ' + units[u];
}


console.log(humanFileSize(5000, true))  // 5.0 kB
console.log(humanFileSize(5000, false))  // 4.9 KiB
console.log(humanFileSize(-10000000000000000000000000000))  // -8271.8 YiB
console.log(humanFileSize(999949, true))  // 999.9 kB
console.log(humanFileSize(999950, true))  // 1.0 MB
console.log(humanFileSize(999950, true, 2))  // 999.95 kB
console.log(humanFileSize(999500, true, 0))  // 1 MB

mpen
quelle
1
Ich nehme eine Anpassung vor: Nehmen Sie bei der Bewertung des Schwellenwerts den absoluten Wert. Auf diese Weise unterstützt die Funktion negative Werte. Gute Funktion! Vielen Dank, dass Sie keine switch-Anweisung verwenden !!
Aaron Blenkush
20
@ AaronBlenkush: Wann hätten Sie eine negative Dateigröße?
Mpen
14
Ich habe gerade Ihre Funktion in ein Google Sheet kopiert, mit dem ich nach einer "Bereinigung" das Größen-Delta anzeige. Vorher, Nachher und Diff. Die Bereinigungsoperation führte zum Wachstum einiger Datenbanktabellen und zur Verringerung anderer. Zum Beispiel hat Tabelle A einen Unterschied von -1,95 MB, während Tabelle B einen Unterschied von 500 kB hat. Deshalb: positiv und negativ :-)
Aaron Blenkush
Hier ist die komprimierte Version des Skripts: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]}
RAnders00
1
@ RAnders00: Danke für die minimierte Version. Können Sie mir sagen, obwohl, warum man die beiden unsichtbaren Unicode - Zeichen U + 200C (ZERO WIDTH NON-JOINER) und U + 200B (ZERO WIDTH SPACE) nach dem eingefügten E oft EiB ? Soll dies ein Wasserzeichen sein, damit Sie nachverfolgen können, wer diesen Code verwendet hat? Wenn ja, hätten Sie das in Ihrem Beitrag transparent machen sollen.
Leviathan
81

Eine weitere Ausführungsform der Berechnung

function humanFileSize(size) {
    var i = Math.floor( Math.log(size) / Math.log(1024) );
    return ( size / Math.pow(1024, i) ).toFixed(2) * 1 + ' ' + ['B', 'kB', 'MB', 'GB', 'TB'][i];
};
Andrew V.
quelle
8
scheint nicht 0 zu behandeln
Offirmo
4
Es behandelt oder nicht 0? Immerhin ist dies mit einem if (size == 0) {} else {} immer noch eleganter als die meisten, die ich gesehen habe.
Rodrigo
13
Das Ändern der ersten Zeile in 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.
Gavin
Nur zur Info; Ich weiß, dass die Antwort einfaches JavaScript ist, aber wenn jemand sie nicht in TypeScript verwenden möchte, funktioniert sie nicht (nicht richtig eingegeben, wie Sie es tun toFixedund dann mit einer Zeichenfolge * 1
rechnen
1
Das *1ändert den Datentyp von Zeichenfolge zu Zahl, also für den Wert1024 Sie 1 kBanstelle von erhalten 1.00 kB. Sie können TypeScript glücklich machen, indem Sie Number((size / Math.pow(1024, i)).toFixed(2))dasselbe tun.
Adrian T
38

Hier ist ein Prototyp, um eine Zahl in eine lesbare Zeichenfolge umzuwandeln, die den neuen internationalen Standards entspricht.

Es gibt zwei Möglichkeiten, große Zahlen darzustellen: Sie können sie entweder in Vielfachen von 1000 = 10 3 (Basis 10) oder 1024 = 2 10 (Basis 2) anzeigen. Wenn Sie durch 1000 teilen, verwenden Sie wahrscheinlich die SI-Präfixnamen. Wenn Sie durch 1024 teilen, verwenden Sie wahrscheinlich die IEC-Präfixnamen. Das Problem beginnt mit der Division durch 1024. Viele Anwendungen verwenden dafür die SI-Präfixnamen und einige die IEC-Präfixnamen. Die aktuelle Situation ist ein Chaos. Wenn Sie SI-Präfixnamen sehen, wissen Sie nicht, ob die Zahl durch 1000 oder 1024 geteilt wird

https://wiki.ubuntu.com/UnitsPolicy

http://en.wikipedia.org/wiki/Template:Quantities_of_bytes

Object.defineProperty(Number.prototype,'fileSize',{value:function(a,b,c,d){
 return (a=a?[1e3,'k','B']:[1024,'K','iB'],b=Math,c=b.log,
 d=c(this)/c(a[0])|0,this/b.pow(a[0],d)).toFixed(2)
 +' '+(d?(a[1]+'MGTPEZY')[--d]+a[2]:'Bytes');
},writable:false,enumerable:false});

Diese Funktion enthält no loopund ist daher wahrscheinlich schneller als einige andere Funktionen.

Verwendung:

IEC-Präfix

console.log((186457865).fileSize()); // default IEC (power 1024)
//177.82 MiB
//KiB,MiB,GiB,TiB,PiB,EiB,ZiB,YiB

SI-Präfix

console.log((186457865).fileSize(1)); //1,true for SI (power 1000)
//186.46 MB 
//kB,MB,GB,TB,PB,EB,ZB,YB

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

function fileSizeSI(a,b,c,d,e){
 return (b=Math,c=b.log,d=1e3,e=c(a)/c(d)|0,a/b.pow(d,e)).toFixed(2)
 +' '+(e?'kMGTPEZY'[--e]+'B':'Bytes')
}
//kB,MB,GB,TB,PB,EB,ZB,YB

IEC

function fileSizeIEC(a,b,c,d,e){
 return (b=Math,c=b.log,d=1024,e=c(a)/c(d)|0,a/b.pow(d,e)).toFixed(2)
 +' '+(e?'KMGTPEZY'[--e]+'iB':'Bytes')
}
//KiB,MiB,GiB,TiB,PiB,EiB,ZiB,YiB

Verwendung:

console.log(fileSizeIEC(7412834521));

Wenn Sie Fragen zu den Funktionen haben, fragen Sie einfach

cocco
quelle
Sehr schöner kompakter Code, ich persönlich würde ein paar zusätzliche Zeichen für die Kontrolle der Dezimalstellen hinzufügen.
Orwellophile
Hallo! Eigentlich ist der Code so, wie ich ihn das erste Mal in jsfiddle geschrieben habe. In den letzten Jahren habe ich gelernt, mit Kurzschrift und Bitweise umzugehen. Langsame mobile Geräte, langsames Internet, nicht viel Platz ... dabei habe ich viel Zeit gespart. Aber das ist noch nicht alles, die Gesamtleistung hat sich in jedem Browser drastisch erhöht und der gesamte Code wird viel schneller geladen ... Ich verwende keine JQuery, sodass ich nicht jedes Mal 100 KB laden muss. Ich muss auch sagen, dass ich Javascript auch in Mikrocontrollern, Smart-TVs und Spielekonsolen schreibe. diejenigen , haben nur begrenzten Raum (MCUs), Leistung (SmartTV ist) und natürlich manchmal langsam connnection (Mobile)
Cocco
Sagte, dass ich hoffe, Sie verstehen meine Wahl. Ich kann nur erklären, was Sie nicht verstehen, oder auf der anderen Seite bin ich immer froh, neue Dinge zu lernen. Wenn mein Code etwas enthält, das die Leistung steigern oder Platz sparen könnte, bin ich froh, das zu hören.
Cocco
18
Die Minimierung sollte Teil Ihres Erstellungsprozesses sein, nicht Ihres Codierungsstils. Aus diesem Grund wird kein seriöser Entwickler diesen Code verwenden, da das Lesen und Überprüfen der Richtigkeit zu lange dauert.
Huysentruitw
1
Für diejenigen, die es hassen, "15.00 Bytes" zu sehen, können Sie diesen Teil nur ein wenig modifizieren:.toFixed(e ? 2 : 0)
Lukman
20
sizeOf = function (bytes) {
  if (bytes == 0) { return "0.00 B"; }
  var e = Math.floor(Math.log(bytes) / Math.log(1024));
  return (bytes/Math.pow(1024, e)).toFixed(2)+' '+' KMGTP'.charAt(e)+'B';
}

sizeOf (2054110009);
// => "1,91 GB"

sizeOf (7054110);
// => "6,73 MB"

sizeOf ((3 · 1024 · 1024));
// => "3.00 MB"

Joshaven Potter
quelle
2
Wenn Sie den zusätzlichen Platz für Bytes entfernen möchten, können Sie den Raum mit der Breite Null verwenden \u200b: '\u200bKMGTP'.
CDMckay
15

Lösung als ReactJS-Komponente

Bytes = React.createClass({
    formatBytes() {
        var i = Math.floor(Math.log(this.props.bytes) / Math.log(1024));
        return !this.props.bytes && '0 Bytes' || (this.props.bytes / Math.pow(1024, i)).toFixed(2) + " " + ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'][i]
    },
    render () {
        return (
            <span>{ this.formatBytes() }</span>
        );
    }
});

UPDATE Für diejenigen, die es6 verwenden, ist hier eine zustandslose Version derselben Komponente

const sufixes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
const getBytes = (bytes) => {
  const i = Math.floor(Math.log(bytes) / Math.log(1024));
  return !bytes && '0 Bytes' || (bytes / Math.pow(1024, i)).toFixed(2) + " " + sufixes[i];
};

const Bytes = ({ bytes }) => (<span>{ getBytes(bytes) }</span>);

Bytes.propTypes = {
  bytes: React.PropTypes.number,
};
Patrick Mencias-Lewis
quelle
1
Vielen Dank. Sie haben gerade "Bytes" in Math.log () in der ersten Zeile der Funktion
getBytes
Sehr schön. Zur Disambiguierung und mit ES6-Notation können Sie Folgendes verwenden: return (! Bytes && '0 Bytes') || ${(bytes / (1024 ** i)).toFixed(2)} ${suffixes[i]};;
Little Brain
12

Basierend auf der Idee von cocco ist hier ein weniger kompaktes - aber hoffentlich umfassenderes - Beispiel.

<!DOCTYPE html>
<html>
<head>
<title>File info</title>

<script>
<!--
function fileSize(bytes) {
    var exp = Math.log(bytes) / Math.log(1024) | 0;
    var result = (bytes / Math.pow(1024, exp)).toFixed(2);

    return result + ' ' + (exp == 0 ? 'bytes': 'KMGTPEZY'[exp - 1] + 'B');
}

function info(input) {
    input.nextElementSibling.textContent = fileSize(input.files[0].size);
} 
-->
</script>
</head>

<body>
<label for="upload-file"> File: </label>
<input id="upload-file" type="file" onchange="info(this)">
<div></div>
</body>
</html> 
KitKat
quelle
8

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.

function humanFileSize(size) {
    if (size < 1024) return size + ' B'
    let i = Math.floor(Math.log(size) / Math.log(1024))
    let num = (size / Math.pow(1024, i))
    let round = Math.round(num)
    num = round < 10 ? num.toFixed(2) : round < 100 ? num.toFixed(1) : round
    return `${num} ${'KMGTPEZY'[i-1]}B`
}

Hier einige Beispiele:

humanFileSize(0)          // "0 B"
humanFileSize(1023)       // "1023 B"
humanFileSize(1024)       // "1.00 KB"
humanFileSize(10240)      // "10.0 KB"
humanFileSize(102400)     // "100 KB"
humanFileSize(1024000)    // "1000 KB"
humanFileSize(12345678)   // "11.8 MB"
humanFileSize(1234567890) // "1.15 GB"
Camilo Martin
quelle
Mit toFixed wird es in eine Zeichenfolge konvertiert, sodass Ihre Runde entweder eine Zeichenfolge oder eine Zahl ist. Dies ist eine schlechte Praxis, Sie können es leicht wieder in eine Zahl umwandeln:+num.tofixed(2)
Vincent Duprez
Deckt .toPrecision(3)nicht alle diese Fälle ab? Oh ... ich denke, es deckt nicht zwischen 1000 und 1023 ab. Schade.
Mpen
7

Ein weiteres Beispiel ähnlich dem hier

function fileSize(b) {
    var u = 0, s=1024;
    while (b >= s || -b >= s) {
        b /= s;
        u++;
    }
    return (u ? b.toFixed(1) + ' ' : b) + ' KMGTPEZY'[u] + 'B';
}

Es misst eine vernachlässigbar bessere Leistung als die anderen mit ähnlichen Merkmalen.

Nick Kuznia
quelle
Dies bietet eine bessere Leistung als einige andere Antworten. Ich benutze das. Einige andere ließen meine Chrome-Tabs hängen und beanspruchten 99,9% der CPU, während ich eine regelmäßige Berechnung durchführte.
Nir Lanka
5

Hier ist meins - funktioniert auch für wirklich große Dateien -_-

function formatFileSize(size)
{
    var sizes = [' Bytes', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB'];
    for (var i = 1; i < sizes.length; i++)
    {
        if (size < Math.pow(1024, i)) return (Math.round((size/Math.pow(1024, i-1))*100)/100) + sizes[i-1];
    }
    return size;
}
fiffy
quelle
Es kombiniert den Leistungseinbruch sowohl des Loopings als auch der Verwendung der Potenzierung, während es ziemlich schwer zu lesen ist. Ich verstehe den Punkt nicht wirklich.
Spektren
2
Verwenden Sie es dann nicht. Es ist nur clientseitige CPU, die verwendet wird, also wen interessiert das;)
fiffy
2
@fiffy Nun, Client-CPU ist auch wertvoll, insbesondere auf Mobilgeräten und mit komplexen Anwendungen. :)
Raito
5

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:

function fileSizeSI(size) {
    var e = (Math.log(size) / Math.log(1e3)) | 0;
    return +(size / Math.pow(1e3, e)).toFixed(2) + ' ' + ('kMGTPEZY'[e - 1] || '') + 'B';
}


// test:
document.write([0, 23, 4322, 324232132, 22e9, 64.22e12, 76.22e15, 64.66e18, 77.11e21, 22e24].map(fileSizeSI).join('<br>'));

Ebrahim Byagowi
quelle
4
1551859712 / 1024 = 1515488
1515488 / 1024 = 1479.96875
1479.96875 / 1024 = 1.44528198242188

Ihre Lösung ist richtig. Es ist wichtig zu wissen, dass Sie, um von 1551859712nach zu gelangen 1.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.

Eli
quelle
@ Eli ... ja, es scheint so. Ich glaube, ich habe "1.5" seit 1551859712 erwartet, aber das würde bedeuten, dass ich nicht binär, sondern dezimal bin.
Hristo
3

Ich fand die Antwort von @ cocco interessant, hatte aber folgende Probleme:

  1. Ändern Sie keine nativen Typen oder Typen, die Sie nicht besitzen
  2. Schreiben Sie sauberen, lesbaren Code für Menschen und lassen Sie Minifahrer den Code für Maschinen optimieren
  3. (Bonus für TypeScript-Benutzer) Spielt nicht gut mit TypeScript

Typoskript:

 /**
 * Describes manner by which a quantity of bytes will be formatted.
 */
enum ByteFormat {
  /**
   * Use Base 10 (1 kB = 1000 bytes). Recommended for sizes of files on disk, disk sizes, bandwidth.
   */
  SI = 0,
  /**
   * Use Base 2 (1 KiB = 1024 bytes). Recommended for RAM size, size of files on disk.
   */
  IEC = 1
}

/**
 * Returns a human-readable representation of a quantity of bytes in the most reasonable unit of magnitude.
 * @example
 * formatBytes(0) // returns "0 bytes"
 * formatBytes(1) // returns "1 byte"
 * formatBytes(1024, ByteFormat.IEC) // returns "1 KiB"
 * formatBytes(1024, ByteFormat.SI) // returns "1.02 kB"
 * @param size The size in bytes.
 * @param format Format using SI (Base 10) or IEC (Base 2). Defaults to SI.
 * @returns A string describing the bytes in the most reasonable unit of magnitude.
 */
function formatBytes(
  value: number,
  format: ByteFormat = ByteFormat.SI
) {
  const [multiple, k, suffix] = (format === ByteFormat.SI
    ? [1000, 'k', 'B']
    : [1024, 'K', 'iB']) as [number, string, string]
  // tslint:disable-next-line: no-bitwise
  const exp = (Math.log(value) / Math.log(multiple)) | 0
  // or, if you'd prefer not to use bitwise expressions or disabling tslint rules, remove the line above and use the following:
  // const exp = value === 0 ? 0 : Math.floor(Math.log(value) / Math.log(multiple)) 
  const size = Number((value / Math.pow(multiple, exp)).toFixed(2))
  return (
    size +
    ' ' +
    (exp 
       ? (k + 'MGTPEZY')[exp - 1] + suffix 
       : 'byte' + (size !== 1 ? 's' : ''))
  )
}

// example
[0, 1, 1024, Math.pow(1024, 2), Math.floor(Math.pow(1024, 2) * 2.34), Math.pow(1024, 3), Math.floor(Math.pow(1024, 3) * 892.2)].forEach(size => {
  console.log('Bytes: ' + size)
  console.log('SI size: ' + formatBytes(size))
  console.log('IEC size: ' + formatBytes(size, 1) + '\n')
});
moribvndvs
quelle
1

Dies ist eine Größenverbesserung der mpen-Antwort

function humanFileSize(bytes, si=false) {
  let u, b=bytes, t= si ? 1000 : 1024;     
  ['', si?'k':'K', ...'MGTPEZY'].find(x=> (u=x, b/=t, b**2<1));
  return `${u ? (t*b).toFixed(1) : bytes} ${u}${!si && u ? 'i':''}B`;    
}

Kamil Kiełczewski
quelle
0

Für diejenigen, die verwenden Angular, gibt es ein Paket namens angular-pipes, das eine Pipe dafür hat:

Datei

import { BytesPipe } from 'angular-pipes';

Verwendung

{{ 150 | bytes }} <!-- 150 B -->
{{ 1024 | bytes }} <!-- 1 KB -->
{{ 1048576 | bytes }} <!-- 1 MB -->
{{ 1024 | bytes: 0 : 'KB' }} <!-- 1 MB -->
{{ 1073741824 | bytes }} <!-- 1 GB -->
{{ 1099511627776 | bytes }} <!-- 1 TB -->
{{ 1073741824 | bytes : 0 : 'B' : 'MB' }} <!-- 1024 MB -->

Link zu den Dokumenten .

Sinandro
quelle
0

Meine Antwort könnte spät sein, aber ich denke, es wird jemandem helfen.

Metrisches Präfix:

/**
 * Format file size in metric prefix
 * @param fileSize
 * @returns {string}
 */
const formatFileSizeMetric = (fileSize) => {
  let size = Math.abs(fileSize);

  if (Number.isNaN(size)) {
    return 'Invalid file size';
  }

  if (size === 0) {
    return '0 bytes';
  }

  const units = ['bytes', 'kB', 'MB', 'GB', 'TB'];
  let quotient = Math.floor(Math.log10(size) / 3);
  quotient = quotient < units.length ? quotient : units.length - 1;
  size /= (1000 ** quotient);

  return `${+size.toFixed(2)} ${units[quotient]}`;
};

Binäres Präfix:

/**
 * Format file size in binary prefix
 * @param fileSize
 * @returns {string}
 */
const formatFileSizeBinary = (fileSize) => {
  let size = Math.abs(fileSize);

  if (Number.isNaN(size)) {
    return 'Invalid file size';
  }

  if (size === 0) {
    return '0 bytes';
  }

  const units = ['bytes', 'kiB', 'MiB', 'GiB', 'TiB'];
  let quotient = Math.floor(Math.log2(size) / 10);
  quotient = quotient < units.length ? quotient : units.length - 1;
  size /= (1024 ** quotient);

  return `${+size.toFixed(2)} ${units[quotient]}`;
};

Beispiele:

// Metrics prefix
formatFileSizeMetric(0)      // 0 bytes
formatFileSizeMetric(-1)     // 1 bytes
formatFileSizeMetric(100)    // 100 bytes
formatFileSizeMetric(1000)   // 1 kB
formatFileSizeMetric(10**5)  // 10 kB
formatFileSizeMetric(10**6)  // 1 MB
formatFileSizeMetric(10**9)  // 1GB
formatFileSizeMetric(10**12) // 1 TB
formatFileSizeMetric(10**15) // 1000 TB

// Binary prefix
formatFileSizeBinary(0)     // 0 bytes
formatFileSizeBinary(-1)    // 1 bytes
formatFileSizeBinary(1024)  // 1 kiB
formatFileSizeBinary(2048)  // 2 kiB
formatFileSizeBinary(2**20) // 1 MiB
formatFileSizeBinary(2**30) // 1 GiB
formatFileSizeBinary(2**40) // 1 TiB
formatFileSizeBinary(2**50) // 1024 TiB
Kerkouch
quelle
-1

let bytes = 1024 * 10 * 10 * 10;

console.log (getReadableFileSizeString (Bytes))

gibt 1000.0Кб anstelle von 1MB zurück

Webolizzer
quelle