Как преобразовать размер байта в человекочитаемый формат в Java? Например, 1024 должно стать «1 Кб», а 1024 * 1024 должно стать «1 Мб».
Мне надоело писать этот метод для каждого проекта. Есть ли в Apache Commons статические методы для этого?
java
formatting
apache-commons
Игорь Мухин
источник
источник
Ответы:
Источник: Форматирование размера байта в удобочитаемый формат | Programming.Guide
SI (1 k = 1000)
Двоичный (1 K = 1024)
Пример вывода:
источник
du
команды в Linux.)FileUtils.byteCountToDisplaySize(long size)
будет работать, если ваш проект может зависеть отorg.apache.commons.io
.JavaDoc для этого метода
источник
Используйте Android встроенный класс
Для Android есть класс Formatter . Всего одна строка кода, и все готово.
Это как
formatFileSize()
, но пытается генерировать более короткие числа (показывая меньше десятичных знаков).Форматирует размер контента в байтах, килобайтах, мегабайтах и т. Д.
источник
Context
.Мы можем полностью избежать использования медленных
Math.pow()
иMath.log()
методов без ущерба для простоты, поскольку коэффициент между единицами (например, B, KB, MB и т. Д.) Равен 1024, что составляет 2 ^ 10. УLong
класса есть удобныйnumberOfLeadingZeros()
метод, который мы можем использовать, чтобы указать, в какую единицу входит значение размера.Ключевой момент: единицы измерения размера имеют расстояние в 10 бит (1024 = 2 ^ 10), что означает позицию старшего 1 бита - или, другими словами, число старших нулей - отличается на 10 (байт = КБ * 1024, КБ = МБ * 1024 и т. Д.).
Корреляция между числом ведущих нулей и единицей измерения:
Финальный код:
источник
Я недавно задавал тот же вопрос:
Формат файла размера как МБ, ГБ и т. Д.
Пока нет готового ответа, я могу жить с решением:
Тестовый код:
Вывод (на моем немецком языке):
Изменить: я открыл проблему, запрашивая эту функцию для Google Guava . Возможно, кто-то захочет поддержать это.
источник
Это модифицированная версия ответа aioobe .
Изменения:
Locale
параметр, потому что некоторые языки используют,.
а другие в,
качестве десятичной точки.источник
Если вы используете Android, вы можете просто использовать android.text.format.Formatter.formatFileSize () .
Альтернативно, вот решение, основанное на этом популярном посте :
Или в Котлине:
источник
unitsCount
и нетunitsCount-1
.if(result<unit) break;
пойдет до этого. Не беспокойся. (Если вы проверите его, вы заметите, что можете полностью пропустить условие цикла for.)источник
источник
Единицы байтов позволяют вам сделать это так:
Я написал другую библиотеку под названием Storage-Unit, которая позволяет вам делать это так:
Если вы хотите форсировать определенный юнит, сделайте это:
источник
источник
Теперь доступна одна библиотека, которая содержит форматирование модулей. Я добавил его в триаву библиотеку , так как единственная другая существующая библиотека, похоже, для Android.
Он может форматировать числа с произвольной точностью в 3 разных системах (SI, IEC, JEDEC) и различных вариантах вывода. Вот несколько примеров кода из модульных тестов triava :
Печать точных килограмм, мегаполисов (здесь с W = Watt):
Вы можете передать DecimalFormat, чтобы настроить вывод:
Для произвольных операций с килограммами или мега значениями вы можете разделить их на компоненты:
источник
Я знаю, что уже поздно обновлять этот пост! но я повеселился с этим:
Создать интерфейс:
Создать класс StorageUnits:
Назови это:
Вывод:
источник
В случайном случае это экономит кому-то немного времени, или, может быть, просто для развлечения, вот версия Go. Для простоты я включил только двоичный регистр вывода.
источник
Просто добавьте больше файловых единиц (если они отсутствуют), и вы увидите размер единицы до этой единицы (если у вашего файла такая большая длина) System.out.println ("Размер файла в правильном формате:" + байты + "" + fileSizeUnits [индекс]); sizeToReturn = String.valueOf (bytes) + "" + fileSizeUnits [index]; вернуть sizeToReturn; }
источник
Вот эквивалент C # .net для правильного согласованного ответа Java выше. (есть еще один, который имеет более короткие коды)
Технически говоря, если мы придерживаемся единиц СИ, эта процедура работает для любого регулярного использования чисел. Есть много других хороших ответов от экспертов. Предположим, вы выполняете привязку данных к числам в виде сетки, поэтому стоит проверить из них подпрограммы, оптимизированные по производительности.
PS: опубликовано, потому что этот вопрос / ответ был на первом месте в поиске Google, пока я работаю над проектом C #.
источник
Вы можете использовать StringUtils «S
TraditionalBinarPrefix
:источник
немного староват, но ... org.springframework.util.unit.DataSize может подойти к этому требованию хотя бы для расчета, тогда подойдет простой декоратор
источник
источник
Вы пробовали JSR 363 ? Его модули расширения модулей, такие как Unicode CLDR (в GitHub: uom-systems ), сделают все это за вас.
Вы можете использовать
MetricPrefix
включенные в каждую реализацию илиBinaryPrefix
(сравнимые с некоторыми из приведенных выше примеров), и если вы, например, живете и работаете в Индии или соседней странеIndianPrefix
(также в общем модуле uom-systems), вы можете использовать и форматировать «Crore» Bytes "или" Lakh Bytes "тоже.источник
Может быть, вы можете использовать этот код (в C #):
источник
источник
Используйте следующую функцию, чтобы получить точную информацию, созданную на основе
ATM_CashWithdrawl
концепции.Я только что изменил код facebookarchive -
StringUtils
чтобы получить следующий формат. Тот же формат, который вы получите при использовании apache.hadoop-StringUtils
Пример использования вышеперечисленных методов:
Байты, чтобы получить выше формат
Для отображения времени в удобочитаемом формате используйте эту функцию
millisToShortDHMS(long duration)
.источник
вот преобразование из @aioobe, преобразованное в kotlin
источник