Jak przekonwertować rozmiar bajtu na format czytelny dla człowieka w Javie? Podobnie 1024 powinno stać się „1 Kb”, a 1024 * 1024 powinno stać się „1 Mb”.
Mam dość pisania tej metody narzędziowej dla każdego projektu. Czy istnieją w tym celu jakieś metody statyczne w Apache Commons ?
java
formatting
apache-commons
Igor Mukhin
źródło
źródło
Odpowiedzi:
Źródło: Formatowanie rozmiaru bajtu na format czytelny dla człowieka | Programowanie. Przewodnik
SI (1 k = 1000)
Binarny (1 K = 1024)
Przykładowe dane wyjściowe:
źródło
du
polecenia w Linuksie.)FileUtils.byteCountToDisplaySize(long size)
działałoby, jeśli Twój projekt może polegaćorg.apache.commons.io
.JavaDoc dla tej metody
źródło
Użyj wbudowanej klasy Androida
W systemie Android istnieje klasowy moduł formatujący . Tylko jeden wiersz kodu i gotowe.
To tak
formatFileSize()
, ale próbuje wygenerować krótsze liczby (pokazujące mniej miejsc po przecinku).Formatuje rozmiar zawartości w postaci bajtów, kilobajtów, megabajtów itp.
źródło
Context
.Możemy całkowicie uniknąć używania metody slow
Math.pow()
iMath.log()
metod bez poświęcania prostoty, ponieważ współczynnik między jednostkami (np. B, KB, MB itp.) Wynosi 1024, czyli 2 ^ 10.Long
Klasa posiada wygodnynumberOfLeadingZeros()
sposób, który możemy wykorzystać, aby powiedzieć, która jednostka wartość wielkości przypada.Kluczowy punkt: Jednostki rozmiaru mają odległość 10 bitów (1024 = 2 ^ 10), co oznacza pozycję najwyższego 1 bitu - lub innymi słowy liczby zer wiodących - różnią się o 10 (Bajty = KB * 1024, KB = MB * 1024 itd.).
Korelacja między liczbą zer wiodących a jednostką wielkości:
Ostateczny kod:
źródło
Ostatnio zadałem to samo pytanie:
Sformatuj rozmiar pliku jako MB, GB itp
Chociaż nie ma gotowej odpowiedzi, mogę żyć z rozwiązaniem:
Kod testowy:
Dane wyjściowe (w moim języku niemieckim):
Edycja: otworzyłem problem z prośbą o tę funkcję dla Google Guava . Być może ktoś zechce to wesprzeć.
źródło
To jest zmodyfikowana wersja odpowiedzi aioobe .
Zmiany:
Locale
parametr, ponieważ niektóre języki używają,.
a inne,
jako przecinek dziesiętny.źródło
Jeśli używasz Androida, możesz po prostu użyć android.text.format.Formatter.formatFileSize () .
Alternatywnie, oto rozwiązanie oparte na tym popularnym poście :
Lub w Kotlin:
źródło
unitsCount
i nieunitsCount-1
.if(result<unit) break;
wpakuje się wcześniej. Bez obaw. (Jeśli go przetestujesz, zauważysz, że możesz całkowicie pominąć warunek pętli for.)źródło
źródło
Byte Units pozwala ci to zrobić w następujący sposób:
Napisałem inną bibliotekę o nazwie Storage-Units, która pozwala ci to zrobić w następujący sposób:
Jeśli chcesz zmusić określoną jednostkę, zrób to:
źródło
źródło
Dostępna jest teraz jedna biblioteka, która zawiera formatowanie jednostek. Dodałem go do triavy biblioteki , ponieważ jedyną istniejącą biblioteką wydaje się być jedna dla Androida.
Może formatować liczby z dowolną dokładnością, w 3 różnych systemach (SI, IEC, JEDEC) i różnych opcjach wyjściowych. Oto kilka przykładów kodu z testów jednostkowych triava :
Drukowanie dokładnych kilogramów, mega wartości (tutaj z W = Watt):
Możesz przekazać DecimalFormat, aby dostosować dane wyjściowe:
W przypadku dowolnych operacji na kilogramach lub mega wartościach możesz podzielić je na komponenty:
źródło
Wiem, że jest za późno na aktualizację tego postu! ale dobrze się z tym bawiłem:
Utwórz interfejs:
Utwórz klasę StorageUnits:
Nazwać:
Wynik:
źródło
W przypadku braku szansy oszczędza to trochę czasu, a może trochę zabawy, oto wersja Go. Dla uproszczenia podałem tylko przypadek wyjścia binarnego.
źródło
Po prostu dodaj więcej jednostek plików (jeśli ich brakuje), a zobaczysz rozmiar jednostki do tej jednostki (jeśli plik ma taką długość) System.out.println („Rozmiar pliku w odpowiednim formacie:„ + bajty + ”” + fileSizeUnits [indeks]); sizeToReturn = String.valueOf (bytes) + "" + fileSizeUnits [index]; return sizeToReturn; }
źródło
Oto odpowiednik C # .net dla poprawnej odpowiedzi konsensusu Java powyżej. (jest inny poniżej, który ma krótsze kody)
Technicznie rzecz biorąc, jeśli trzymamy się jednostek SI, ta procedura działa dla każdego regularnego używania liczb. Istnieje wiele innych dobrych odpowiedzi od ekspertów. Załóżmy, że wykonujesz wiązanie danych liczb w widokach siatki, warto sprawdzić z nich procedury zoptymalizowane pod kątem wydajności.
PS: Wysłano, ponieważ to pytanie / odpowiedź pojawiło się na górze w wyszukiwarce Google, gdy wykonuję projekt w języku C #.
źródło
Można użyć StringUtils S”
TraditionalBinarPrefix
:źródło
nieco stary, ale ... org.springframework.util.unit.DataSize może pasować do tego wymagania przynajmniej do obliczeń, wtedy wystarczy prosty dekorator
źródło
źródło
Czy próbowałeś JSR 363 ? Jego moduły rozszerzeń jednostek, takie jak Unicode CLDR (w GitHub: uom-systems ), robią to wszystko za Ciebie.
Możesz użyć
MetricPrefix
zawartych w każdej implementacji lubBinaryPrefix
(porównywalne z niektórymi przykładami powyżej), a jeśli np. Mieszkasz i pracujesz w Indiach lub w pobliskim kraju,IndianPrefix
(także we wspólnym module systemów uom), możesz użyć i sformatować „Crore Bajty ”lub„ Lakh Bytes ”też.źródło
Może możesz użyć tego kodu (w języku C #):
źródło
źródło
Użyj następującej funkcji, aby uzyskać dokładne informacje, wygenerowane na podstawie
ATM_CashWithdrawl
koncepcji.Właśnie zmodyfikowałem kod facebookarchive,
StringUtils
aby uzyskać poniższy format. Ten sam format, który otrzymasz, gdy używasz apache.hadoop-StringUtils
Przykładowe użycie powyższych metod:
Bajty, aby uzyskać powyżej formatu
Aby wyświetlić czas w formacie czytelnym dla człowieka, użyj tej funkcji
millisToShortDHMS(long duration)
.źródło
oto konwersja z @aioobe przekonwertowana na kotlin
źródło