691 Stimmen

Wie kann ich in Java die Bytegröße in ein für Menschen lesbares Format umwandeln?

Wie kann ich in Java die Bytegröße in ein für Menschen lesbares Format umwandeln?

So sollte 1024 zu "1 Kb" und 1024*1024 zu "1 Mb" werden.

Ich bin es leid, diese Dienstprogrammmethode für jedes Projekt zu schreiben. Gibt es eine statische Methode in Apache Commons für das hier?

43 Stimmen

Wenn Sie die standardisierten Einheiten verwenden, sollte 1024 zu "1KiB" und 1024*1024 zu "1MiB" werden. de.wikipedia.org/wiki/Binary_prefix

0 Stimmen

@Pascal: Es sollte mehrere Funktionen oder eine Option zur Angabe der Basis und der Einheit geben.

0 Stimmen

8voto

Sebastian Hoß Punkte 81

Byte-Einheiten können Sie das so machen:

long input1 = 1024;
long input2 = 1024 * 1024;

Assert.assertEquals("1 KiB", BinaryByteUnit.format(input1));
Assert.assertEquals("1 MiB", BinaryByteUnit.format(input2));

Assert.assertEquals("1.024 KB", DecimalByteUnit.format(input1, "#.0"));
Assert.assertEquals("1.049 MB", DecimalByteUnit.format(input2, "#.000"));

NumberFormat format = new DecimalFormat("#.#");
Assert.assertEquals("1 KiB", BinaryByteUnit.format(input1, format));
Assert.assertEquals("1 MiB", BinaryByteUnit.format(input2, format));

Ich habe eine weitere Bibliothek geschrieben, die Speicher-Einheiten die es Ihnen ermöglicht, dies so zu tun:

String formattedUnit1 = StorageUnits.formatAsCommonUnit(input1, "#");
String formattedUnit2 = StorageUnits.formatAsCommonUnit(input2, "#");
String formattedUnit3 = StorageUnits.formatAsBinaryUnit(input1);
String formattedUnit4 = StorageUnits.formatAsBinaryUnit(input2);
String formattedUnit5 = StorageUnits.formatAsDecimalUnit(input1, "#.00", Locale.GERMAN);
String formattedUnit6 = StorageUnits.formatAsDecimalUnit(input2, "#.00", Locale.GERMAN);
String formattedUnit7 = StorageUnits.formatAsBinaryUnit(input1, format);
String formattedUnit8 = StorageUnits.formatAsBinaryUnit(input2, format);

Assert.assertEquals("1 kB", formattedUnit1);
Assert.assertEquals("1 MB", formattedUnit2);
Assert.assertEquals("1.00 KiB", formattedUnit3);
Assert.assertEquals("1.00 MiB", formattedUnit4);
Assert.assertEquals("1,02 kB", formattedUnit5);
Assert.assertEquals("1,05 MB", formattedUnit6);
Assert.assertEquals("1 KiB", formattedUnit7);
Assert.assertEquals("1 MiB", formattedUnit8);

Falls Sie eine bestimmte Einheit erzwingen wollen, tun Sie dies:

String formattedUnit9 = StorageUnits.formatAsKibibyte(input2);
String formattedUnit10 = StorageUnits.formatAsCommonMegabyte(input2);

Assert.assertEquals("1024.00 KiB", formattedUnit9);
Assert.assertEquals("1.00 MB", formattedUnit10);

7voto

Tama Punkte 380

Org.springframework.util.unit.DataSize könnte diese Anforderung zumindest für die Berechnung erfüllen. Dann ist ein einfacher Dekorator ausreichend.

5voto

Michel Jung Punkte 2568

Eine weitere prägnante Lösung ohne Schleife, aber mit ortsabhängiger Formatierung und korrekten Binärpräfixen:

import java.util.Locale;

public final class Bytes {

  private Bytes() {
  }

  public static String format(long value, Locale locale) {
    if (value < 1024) {
      return value + " B";
    }
    int z = (63 - Long.numberOfLeadingZeros(value)) / 10;
    return String.format(locale, "%.1f %siB", (double) value / (1L << (z * 10)), " KMGTPE".charAt(z));
  }
}

Test:

Locale locale = Locale.getDefault()
System.out.println(Bytes.format(1L, locale))
System.out.println(Bytes.format(2L * 1024, locale))
System.out.println(Bytes.format(3L * 1024 * 1024, locale))
System.out.println(Bytes.format(4L * 1024 * 1024 * 1024, locale))
System.out.println(Bytes.format(5L * 1024 * 1024 * 1024 * 1024, locale))
System.out.println(Bytes.format(6L * 1024 * 1024 * 1024 * 1024 * 1024, locale))
System.out.println(Bytes.format(Long.MAX_VALUE, locale))

Ausgabe:

1 B
2.0 KiB
3.0 MiB
4.0 GiB
5.0 GiB
6.0 PiB
8.0 EiB

5voto

XXX Punkte 8832
    public static String floatForm (double d)
    {
       return new DecimalFormat("#.##").format(d);
    }

    public static String bytesToHuman (long size)
    {
        long Kb = 1  * 1024;
        long Mb = Kb * 1024;
        long Gb = Mb * 1024;
        long Tb = Gb * 1024;
        long Pb = Tb * 1024;
        long Eb = Pb * 1024;

        if (size <  Kb)                 return floatForm(        size     ) + " byte";
        if (size >= Kb && size < Mb)    return floatForm((double)size / Kb) + " Kb";
        if (size >= Mb && size < Gb)    return floatForm((double)size / Mb) + " Mb";
        if (size >= Gb && size < Tb)    return floatForm((double)size / Gb) + " Gb";
        if (size >= Tb && size < Pb)    return floatForm((double)size / Tb) + " Tb";
        if (size >= Pb && size < Eb)    return floatForm((double)size / Pb) + " Pb";
        if (size >= Eb)                 return floatForm((double)size / Eb) + " Eb";

        return "???";
    }

4voto

Christian Esken Punkte 452

Es gibt jetzt eine Bibliothek, die die Formatierung von Einheiten enthält. Ich habe sie der triava Bibliothek, da die einzige andere existierende Bibliothek eine für Android zu sein scheint.

Es kann Zahlen mit beliebiger Genauigkeit, in 3 verschiedenen Systemen (SI, IEC, JEDEC) und verschiedenen Ausgabeoptionen formatieren. Hier sind einige Code-Beispiele aus dem triava unit tests :

UnitFormatter.formatAsUnit(1126, UnitSystem.SI, "B");
// = "1.13kB"
UnitFormatter.formatAsUnit(2094, UnitSystem.IEC, "B");
// = "2.04KiB"

Drucken von exakten Kilo- und Megawerten (hier mit W = Watt):

UnitFormatter.formatAsUnits(12_000_678, UnitSystem.SI, "W", ", ");
// = "12MW, 678W"

Sie können ein DecimalFormat übergeben, um die Ausgabe anzupassen:

UnitFormatter.formatAsUnit(2085, UnitSystem.IEC, "B", new DecimalFormat("0.0000"));
// = "2.0361KiB"

Für beliebige Operationen mit Kilo- oder Megawerten können Sie diese in Komponenten aufteilen:

UnitComponent uc = new  UnitComponent(123_345_567_789L, UnitSystem.SI);
int kilos = uc.kilo(); // 567
int gigas = uc.giga(); // 123

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