Format Byte zu Kilobyte, Megabyte, Gigabyte
Szenario: die Größe der verschiedenen Dateien werden in einer Datenbank gespeichert als bytes. Was ist der beste Weg, um dieses format size info, um Kilobyte, Megabyte und Gigabyte? Zum Beispiel habe ich ein MP3, dass Ubuntu zeigt, wie "5.2 MB (5445632 bytes)". Wie würde ich diese Anzeige auf einer web-Seite als "5.2 MB" UND Dateien, die weniger als ein megabyte display als KB und Dateien, die ein gigabyte und höher angezeigt als GB?
- Ich glaub Sie sollten erstellen Sie eine Funktion, dies zu tun. Nur dividieren-Zahl durch 1024 und betrachten Sie das Ergebnis. Wenn Ihr mehr als 1024 sich dann wieder trennen.
- Es sollte eine native Funktion für diese.
Du musst angemeldet sein, um einen Kommentar abzugeben.
(Entnommen aus php.net, gibt es viele andere Beispiele gibt, aber diese mag ich am besten 🙂
$bytes /= (1 << (10 * $pow))
oder dergleichen, ich konnte besser gefallen. 😛9287695
zurück8.86 MB
mit einer Genauigkeit von 2. Das scheint nicht richtig.KiB
,MiB
,GiB
undTiB
da Sie sich durch1024
. Wenn Sie geteilt durch1000
es wäre ohne diei
.$bytes /= (1 << (10 * $pow))
funktioniert nicht gut, aber die Nummer über 1 TBUncomment one of the following alternatives
war etwas, was ich gar nicht bemerkt, für 5 Minuten ...$bytes = max($bytes, 0);
hier verwendet?Dies ist Chris Jester-Jungen, die Implementierung saubersten die ich je gesehen habe, kombiniert mit php.net's und ein precision-argument.
$suffixes = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
ich will eine Yottabyte Festplatte! 😛formatBytes(259748192, 3)
zurück259748192 MB
was nicht Recht ist1024
anstelle von mit Hilfe der diff-Konverter wie$unitInBytes = 1 * pow(2, 10)
dann tut einreturn ($size / $unitInBytes)
oder eine Kombination davon, warum funktioniert diese Methode bessere Ergebnisse produzieren? Jede Klärung wird geschätzt, ihn zu verstehen, anstatt einfach nur zu kopieren/einfügen und nie darüber nachdenken, wieder.Pseudocode:
1000
und nicht1024
. was für ein Durcheinander..Dies ist Kohana ist Umsetzung, Sie können es verwenden:
$force_unit
und$si
scheinen das gleiche zu tun. Du kannst auch eine beliebige Zeichenfolge mit einem "i" in$force_unit
, weil Sie testen für die position. Die dezimal-Formatierung ist auch overkill.Nur dividieren durch 1024 für kb, 1024^2 für mb und 1024^3 für GB. So einfach ist das.
verwenden Sie diese Funktion, wenn Sie möchten, einen kurzen code
bcdiv()
Nur meine alternative, kurz und sauber:
oder mehr dumm und effizient:
Ich weiß, es ist vielleicht ein wenig spät, um diese Frage zu beantworten, aber, mehr Daten werden nicht gehen, um jemanden umzubringen. Hier ist eine sehr schnelle Funktion :
EDIT: habe meinen Beitrag aktualisiert, gehören die fix-vorgeschlagen von camomileCase:
Einfache Funktion
Mein Ansatz
Gelang es mir mit der folgenden Funktion,
versuchen Sie dieses 😉
Weiß ich nicht, warum sollte man es so kompliziert wie die anderen.
Den folgenden code viel einfacher zu verstehen und zu 25% schneller als die anderen Lösungen, die verwendet die log-Funktion (die Funktion aufgerufen 20 Mio. Male mit verschiedenen Parametern)
Diese Arbeit mit dem letzten PHP -
Flexible Lösung:
Hier ist die vereinfachte Implementierung des Drupal format_size Funktion:
Es ist ein wenig spät, aber eine etwas schnellere version von die akzeptierte Antwort ist unten:
Ist es effizienter, aufgrund der Ausführung eines single-log-2-Betrieb anstelle von zwei log-e Operationen.
Es ist tatsächlich schneller zu tun, die mehr offensichtliche Lösung beschrieben, aber:
Dies ist, weil, wie der index berechnet wird, zur gleichen Zeit, als der Wert die Anzahl der bytes in der entsprechenden Einheit. Dieser Schnitt die Ausführungszeit von über 35% (55% Erhöhung der Geschwindigkeit).
Andere condensed-Implementierung, die übersetzen kann auf der Basis 1024 (Binär) oder base 1000 (dezimal) und funktioniert auch mit unglaublich großen zahlen daher von der Verwendung des bc-Bibliothek:
bcpow()
werfen eine TypeError-Ausnahme aus, wenn$base
und$i
sind nicht als string-Werte. Getestet auf PHP-version 7.0.11.Ich dachte, ich möchte hinzufügen, ein Ineinandergreifen der beiden Einreicher code (Mit John Himmelman ' s code, das ist in diesem thread, und mit Eugene Kuzmenko's code), die ich verwende.
Diese verwendet Eugene ' s code format der
$value
in bytes (ich halte meine Daten in MB, also es wandelt meine Daten:10485760 MB
in10995116277760
) - es verwendet dann das Johannes-code zu konvertieren Sie in den richtigen Wert anzeigen (10995116277760
in10 TB
).Ich habe festgestellt, dass dies wirklich hilfreich - also mein Dank an die beiden Einsender!
Extrem einfache Funktion, um die menschliche Größe der Datei.
Original-Quelle: http://php.net/manual/de/function.filesize.php#106569
Copy/paste-code:
Entwickelte ich meine eigene Funktion zum konvertieren von human-readable memory-Größe in unterschiedlichen Größen.
Diese Funktion akzeptiert keine Speicher-Größe Abkürzung wie "MB, MB, Mb, mb, m, Kb, K, KB, b, TB, T...." so ist es auch Tippfehler sicher.
Rufen Sie einfach die Funktion
Basis auf Leo ' s Antwort, fügen Sie
Wenn Sie möchten, dass max Einheit zu Mega wechseln
$units = explode(' ', ' K M');