466 Stimmen

Richtiger Weg, um die Größe in Bytes in KB, MB, GB in JavaScript umzuwandeln

Ich habe diesen Code erhalten, um die Größe in Bytes über PHP umzurechnen.

Jetzt möchte ich diese Größen in benutzerfreundliche Größen mit JavaScript umrechnen. Ich habe versucht, diesen Code in JavaScript umzuwandeln, der so aussieht:

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?

0voto

cnd Punkte 1

Dies ist ein Follow-up zur derzeit höchstbewerteten Antwort.

Spezialfall

Ich habe einen Spezialfall gefunden: sehr winzige Datenmengen! Genauer gesagt, wenn die Anzahl der Bytes zwischen -1 und 1 (ausschließlich) liegt.

Zum Beispiel, betrachten Sie 0,25 Bytes. In diesem Fall wird Math.floor(Math.log(0.25) / Math.log(1024)) -1 zurückgeben. Da -1 kein gültiger Index ist, wird formatBytes(0.25) etwas wie "0.25 undefined" zurückgeben.

Hier ist eine Illustration des Spezialfalls mit Hilfe von Wolfram Alpha.

Fix

Ich habe das behoben, indem ich Math.max(0, ...) hinzugefügt habe:

Math.max(0, Math.floor(Math.log(bytes) / Math.log(1024))

Math.max(0, ...) stellt sicher, dass der Indexwert immer mindestens 0 ist.

0voto

Giath Atrach Punkte 1
function bytes(value = 1, from = "mb", to = "b") {
    const bytes = {'b':1,'kb':2,'mb':3,'gb':4,'tb':5,'pb':6,'eb':7,'zb':8,'yb':9};
    let a = bytes[from], b = bytes[to];
    if(a>b)
        for(let i = 0;i < (a-b);i++)
            value *=1024;
    else
        for(let i = 0;i < (b-a);i++)
            value /=1024;
    return value;
}
console.log(bytes());
console.log(bytes(1024, "kb", "mb"));
console.log(bytes(1, "gb", "kb"));

0voto

tomer Punkte 9

Ich hatte ein Problem mit Metadaten bei Dateien, die vom Server zurückgegeben wurden, mit verschiedenen Größeneinheiten. Ich habe die Antwort von @Alicejim verwendet und versucht, sie allgemeiner zu gestalten. Hier ist der Code, vielleicht hilft es jemandem.

enum SizeUnits {
   Bytes = 'Bytes',
   KB = 'KB',
   MB = 'MB',
   GB = 'GB',
   TB = 'TB',
   PB = 'PB',
   EB = 'EB',
   ZB = 'ZB',
   YB = 'YB'
}
function convertSizeUnites(size: number, sourceSizeUnits: SizeUnits, targetSizeUnits: SizeUnits) {
    const i = Object.keys(SizeUnits).indexOf(sourceSizeUnits);
    const sizeInBytes = size * Math.pow(1024, i);
    const j = Object.keys(SizeUnits).indexOf(targetSizeUnits);
    return sizeInBytes / Math.pow(1024, j);
}
function formatSize(size: number, measureUnit: SizeUnits, decimals = 2) {
    if (size === 0) return '0 Bytes';
    const sizeInBytes = convertSizeUnites(size, measureUnit, SizeUnits.Bytes);
    const dm = decimals < 0 ? 0 : decimals;
    const i = Math.floor(Math.log(sizeInBytes) / Math.log(1024));
    return parseFloat((sizeInBytes / Math.pow(1024, i)).toFixed(dm)) + ' ' + 
    Object.keys(SizeUnits)[i];
}

0voto

Eduardo Lucio Punkte 1103

Gleiche Antwort von @Aliceljm, aber auf eine "didaktischere" Weise. Danke! =D

function formatBytes(numBytes, decPlaces) {
    /* Passt die angegebene Anzahl von Bytes entsprechend dem Wert an die 
    geeignetste Metrik an.

    Args:
        numBytes (number): Die Anzahl von Bytes (ganze Zahl);
        decPlaces (Optional[number])): Die Anzahl der Dezimalstellen (ganze Zahl). Falls
            es "undefined" ist, wird der Wert "2" angenommen.

    Returns:
        string: Die angepasste Zahl zusammen mit der geeignetsten Metrik. */

    if (numBytes === 0) {
        return "0 Bytes";
    }

    // HINWEIS: 1 KB entspricht 1024 Bytes. Von Questor
    // [Ref(s).: https://en.wikipedia.org/wiki/Kilobyte ]
    var oneKByte = 1024;

    // HINWEIS: Behandelt den Fall, dass "decPlaces" "undefined" ist. Falls es "undefined" ist, wird der Wert
    // "2" angenommen. Von Questor
    if (decPlaces === undefined || decPlaces === "") {
        decPlaces = 2;
    }

    var byteMtrcs = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
    // Byte Metriken

    // HINWEIS: Legt den Faktor für die Anzahl von Bytes und die Metrik fest. Von Questor
    var mtrcNumbFactor = Math.floor(Math.log(numBytes) / Math.log(oneKByte));
    // Metrik Nummernfaktor

    return parseFloat((numBytes / Math.pow(oneKByte, mtrcNumbFactor)).
            toFixed(decPlaces)) + " " + byteMtrcs[mtrcNumbFactor];
}

0voto

nkitku Punkte 3128

EINFÜGERSPRUCH

const b2s=t=>{let e=Math.log2(t)/10|0;return(t/1024**(e=e<=0?0:e)).toFixed(3)+"BKMGP"[e]};

console.log(b2s(0));
console.log(b2s(123));
console.log(b2s(123123));
console.log(b2s(123123123));
console.log(b2s(123123123123));
console.log(b2s(123123123123123));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X