Herausforderung und Herkunft
Bei Stack Overflow lautet eine häufig gestellte Frage: Wie konvertiert man Bytes in ein für Menschen lesbares Format in Java? Die am häufigsten gewählte Antwort hat eine ganz gute Methode, um dies zu tun, aber das ist Codegolf und wir können es besser machen, nicht wahr?
Ihre Herausforderung besteht darin, eine Methode oder ein Programm zu schreiben, die bzw. das die angegebene Anzahl von Bytes in das korrekte, für Menschen lesbare Format konvertiert und das Ergebnis gemäß dem Standard in Ihrer Sprache ausgibt. *
* Siehe die Regeln für mehr Klarheit!
Eingang
Die Eingabe ist immer eine positive Anzahl von Bytes mit einem Maximum von (2 ^ 31) -1.
Ausgabe
Sie können wählen, ob Sie das Internationale Einheitensystem oder die Binärnotation als Ausgabe bevorzugen (die SI-Notation spart Ihnen wahrscheinlich einige Bytes).
SI: B, kB, MB, GB
Binary: B, KiB, MiB, GiB
Hinweis: Höhere Einheiten als GB oder GiB sind aufgrund des eingeschränkten Eingangsbereichs nicht möglich.
Beispielausgabe
Internationales Einheitensystem:
Input Output
0 0.0 B
999 999.0 B
1000 1.0 kB
1023 1.0 kB
1024 1.0 kB
1601 1.6 kB
160581 160.6 kB
4066888 4.1 MB
634000000 634.0 MB
2147483647 2.1 GB
Binär:
Input Output
0 0.0 B
999 999.0 B
1000 1000.0 B
1023 1023.0 B
1024 1.0 KiB
1601 1.6 KiB
160581 156.8 KiB
4066888 3.9 MiB
634000000 604.6 MiB
2147483647 2.0 GiB
Regeln
- Eingebaute Funktionen zur Byte-Formatierung sind nicht erlaubt!
- Die Ausgabe sollte immer im selben Notationsstandard sein, Sie dürfen SI oder Binär nicht mischen;
- Die Ausgabe sollte immer in der größtmöglichen Einheit erfolgen, wobei die resultierende Zahl immer noch höher oder gleich eins ist.
- Die Ausgabe sollte immer eine Dezimalzahl haben. Sie können jedoch auch eine Ganzzahl ausgeben, wenn die resultierende Ausgabe in Byte (B) vorliegt.
- Sie können wählen, ob Sie ein Leerzeichen, einen Tabulator oder nichts zwischen der Nummer und der Einheit einfügen möchten.
- Die Eingabe erfolgt über STDIN oder Funktionsparameter;
- Die Ausgabe wird auf die Konsole gedruckt oder als Zeichenfolge (oder ähnlicher Zeichencontainer) zurückgegeben.
- Das ist Codegolf, also gewinnt die kürzeste Antwort. Habe Spaß!
Edit: Noch mehr Klarheit
Einige Zahlen haben ein interessantes Rundungsverhalten wie die Zahl 999950. Die meisten Codeimplementierungen würden 1000,0 kB anstelle von 1,0 MB zurückgeben. Warum? Denn 999950/1000 ergibt 999.950, was bei Verwendung von String.format in Java (auch in den meisten anderen Sprachen) effektiv auf 1000.0 gerundet wird. Um solche Fälle zu bearbeiten, sind einige zusätzliche Überprüfungen erforderlich.
Für diese Herausforderung werden beide Stile mit 1000,0 kB und 1,0 MB akzeptiert, obwohl der letzte Stil bevorzugt wird.
Pseudocode / Java-Testcode:
public static String bytesToSI(long bytes){ if (bytes < 1000){ return bytes + ".0 B"; } //Without this rounding check: //999950 would be 1000.0 kB instead of 1.0 MB //999950000 would be 1000.0 MB instead of 1.0 GB int p = (int) Math.ceil(Math.log(bytes) / Math.log(1000)); if(bytes/Math.pow(1000, p) < 0.99995){ p--; } //Format return String.format("%.1f %sB", bytes/Math.pow(1000, p), "kMGTPE".charAt(p-1)); }
999999und 1000000? 160581Ausstellungsrundung, so soll es sein 1000.0kBund 1.0MB?
kB(beachten Sie den Kleinbuchstaben k)