Wie konvertiere ich die Bytegröße in Java in ein lesbares Format? Wie 1024 sollte "1 Kb" und 1024 * 1024 sollte "1 Mb" werden.
Ich habe es satt, diese Dienstprogrammmethode für jedes Projekt zu schreiben. Gibt es dafür in Apache Commons statische Methoden ?
java
formatting
apache-commons
Igor Mukhin
quelle
quelle
Antworten:
Quelle: Formatieren der Bytegröße in ein lesbares Format Programming.Guide
SI (1 k = 1.000)
Binär (1 K = 1.024)
Beispielausgabe:
quelle
du
Befehl unter Linux zu sein.)FileUtils.byteCountToDisplaySize(long size)
würde funktionieren, wenn Ihr Projekt abhängen kannorg.apache.commons.io
.JavaDoc für diese Methode
quelle
Verwenden Sie die in Android integrierte Klasse
Für Android gibt es eine Klasse Formatter . Nur eine Codezeile und Sie sind fertig.
Es ist wie
formatFileSize()
, aber es wird versucht, kürzere Zahlen zu generieren (mit weniger Dezimalstellen).Formatiert eine Inhaltsgröße in Form von Bytes, Kilobytes, Megabytes usw.
quelle
Context
.Wir können die Verwendung der langsamen
Math.pow()
undMath.log()
Methoden vollständig vermeiden, ohne die Einfachheit zu beeinträchtigen, da der Faktor zwischen den Einheiten (z. B. B, KB, MB usw.) 1024 beträgt, was 2 ^ 10 ist. DieLong
Klasse verfügt über eine praktischenumberOfLeadingZeros()
Methode, mit der wir feststellen können, in welche Einheit der Größenwert fällt.Schlüsselpunkt: Größeneinheiten haben einen Abstand von 10 Bit (1024 = 2 ^ 10), was bedeutet, dass sich die Position des höchsten 1 Bits - oder mit anderen Worten die Anzahl der führenden Nullen - um 10 unterscheidet (Bytes = KB * 1024, KB = MB) * 1024 usw.).
Korrelation zwischen Anzahl der führenden Nullen und Größeneinheit:
Der endgültige Code:
quelle
Ich habe kürzlich dieselbe Frage gestellt:
Formatieren Sie die Dateigröße als MB, GB usw.
Es gibt zwar keine sofort einsatzbereite Antwort, aber ich kann mit der Lösung leben:
Testcode:
Ausgabe (in meinem deutschen Gebietsschema):
Bearbeiten: Ich habe ein Problem geöffnet , in dem diese Funktionalität für Google Guava angefordert wurde . Vielleicht würde es jemand gerne unterstützen.
quelle
Dies ist eine modifizierte Version der Antwort von aioobe .
Änderungen:
Locale
Parameter, da einige Sprachen.
und andere,
als Dezimalpunkt verwenden.quelle
Wenn Sie Android verwenden, können Sie einfach android.text.format.Formatter.formatFileSize () verwenden .
Alternativ, hier ist eine Lösung, die auf diesem beliebten Beitrag basiert :
Oder in Kotlin:
quelle
unitsCount
und nichtunitsCount-1
.if(result<unit) break;
wird vorher eintreten. Keine Sorge. (Wenn Sie es testen, werden Sie feststellen, dass Sie die for-Schleife-Bedingung vollständig überspringen können.)quelle
quelle
Mit Byte Units können Sie dies folgendermaßen tun:
Ich habe eine andere Bibliothek namens Speichereinheiten geschrieben , mit der Sie dies folgendermaßen tun können:
Wenn Sie eine bestimmte Einheit erzwingen möchten, gehen Sie folgendermaßen vor:
quelle
quelle
Es ist jetzt eine Bibliothek verfügbar, die die Formatierung von Einheiten enthält. Ich habe es der Triava- Bibliothek hinzugefügt , da die einzige andere vorhandene 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 Codebeispiele aus den Triava-Unit-Tests :
Drucken von exakten Kilo- und Megawerten (hier mit W = Watt):
Sie können ein DecimalFormat übergeben, um die Ausgabe anzupassen:
Für beliebige Operationen mit Kilo- oder Megawerten können Sie diese in Komponenten aufteilen:
quelle
Ich weiß, dass es zu spät ist, diesen Beitrag zu aktualisieren! aber ich hatte ein bisschen Spaß damit:
Erstellen Sie eine Schnittstelle:
Erstellen Sie die StorageUnits-Klasse:
Nennen:
Ausgabe:
quelle
In der Off-Chance spart es jemandem ein bisschen Zeit oder vielleicht nur für ein bisschen Spaß, hier ist eine Go-Version. Der Einfachheit halber habe ich nur den Fall der binären Ausgabe aufgenommen.
quelle
Fügen Sie einfach weitere Dateieinheiten hinzu (falls vorhanden), und Sie sehen die Einheitengröße bis zu dieser Einheit (wenn Ihre Datei so lang ist). System.out.println ("Dateigröße im richtigen Format:" + Bytes + "" + fileSizeUnits [Index]); sizeToReturn = String.valueOf (Bytes) + "" + fileSizeUnits [index]; return sizeToReturn; }}
quelle
Hier ist das C # .net-Äquivalent für die oben angegebene korrekte Java-Konsensantwort. (Es gibt eine andere unten, die kürzere Codes haben)
Technisch gesehen funktioniert diese Routine, wenn wir uns an SI-Einheiten halten, für jede regelmäßige Verwendung von Zahlen. Es gibt viele andere gute Antworten von Experten. Angenommen, Sie führen die Datenbindung von Zahlen in Gridviews durch. Es lohnt sich, leistungsoptimierte Routinen daraus zu überprüfen.
PS: Gepostet, weil diese Frage / Antwort bei der Google-Suche während des C # -Projekts ganz oben stand.
quelle
Sie können mit StringUtils ‚s
TraditionalBinarPrefix
:quelle
etwas alt, aber ... org.springframework.util.unit.DataSize könnte zumindest für die Berechnung zu dieser Anforderung passen, dann reicht ein einfacher Dekorateur
quelle
quelle
Haben Sie JSR 363 ausprobiert ? Die Einheitenerweiterungsmodule wie Unicode CLDR (in GitHub: uom-systems ) erledigen das alles für Sie.
Sie können
MetricPrefix
in jeder Implementierung enthalten oderBinaryPrefix
(vergleichbar mit einigen der obigen Beispiele) und wenn Sie zB in Indien oder einem nahe gelegenen Land leben und arbeiten,IndianPrefix
(auch im gemeinsamen Modul von UOM-Systemen) können Sie "Crore" verwenden und formatieren Bytes "oder" Lakh Bytes "auch.quelle
Vielleicht können Sie diesen Code verwenden (in C #):
quelle
quelle
Verwenden Sie die folgende Funktion, um genaue Informationen zu erhalten. Diese werden anhand der
ATM_CashWithdrawl
Konzeptbasis generiert .Ich habe gerade den Code von facebookarchive
StringUtils
geändert , um das folgende Format zu erhalten. Das gleiche Format erhalten Sie, wenn Sie apache.hadoop- verwenden.StringUtils
Beispiel für die Verwendung der oben genannten Methoden:
Bytes, um über das Format zu gelangen
Verwenden Sie diese Funktion, um die Zeit in einem für Menschen lesbaren Format anzuzeigen
millisToShortDHMS(long duration)
.quelle
Hier ist die Konvertierung von @aioobe in Kotlin konvertiert
quelle