Преобразование KB в MB, GB, TB динамически
public String size(int size){
String hrSize = "";
int k = size;
double m = size/1024;
double g = size/1048576;
double t = size/1073741824;
DecimalFormat dec = new DecimalFormat("0.00");
if (k>0)
{
hrSize = dec.format(k).concat("KB");
}
if (m>0)
{
hrSize = dec.format(m).concat("MB");
}
if (g>0)
{
hrSize = dec.format(g).concat("GB");
}
if (t>0)
{
hrSize = dec.format(t).concat("TB");
}
return hrSize;
}
Это метод, который должен возвращать размер в GB, MB, KB или TB. Входное значение находится в КБ.
например, результат для 1245 должен равняться 1,21 МБ, но я получаю 1,00 МБ.
Ответы
Ответ 1
Вы выполняете integer division
. Таким образом, результат деления также integer
. Дробная часть усечена.
so, 1245 / 1024 = 1
Измените деление на floating point division
: -
double m = size/1024.0;
double g = size/1048576.0;
double t = size/1073741824.0;
Кроме того, ваше сравнение ошибочно. Вы должны сделать сравнение с 1
.
if (m > 1), if (t > 1), if (g > 1)
В идеале я бы изменил ваше сравнение: -
if (t > 1) {
hrSize = dec.format(t).concat("TB");
} else if (g > 1) {
hrSize = dec.format(g).concat("GB");
} else if (m > 1) {
hrSize = dec.format(m).concat("MB");
} else {
hrSize = dec.format(size).concat("KB");
}
Сначала нужно сравнить с более высоким модулем, а затем перейти к нижнему.
Ответ 2
Измененная версия. Выбирает только один раз. Включает "Байты".
public static String formatFileSize(long size) {
String hrSize = null;
double b = size;
double k = size/1024.0;
double m = ((size/1024.0)/1024.0);
double g = (((size/1024.0)/1024.0)/1024.0);
double t = ((((size/1024.0)/1024.0)/1024.0)/1024.0);
DecimalFormat dec = new DecimalFormat("0.00");
if ( t>1 ) {
hrSize = dec.format(t).concat(" TB");
} else if ( g>1 ) {
hrSize = dec.format(g).concat(" GB");
} else if ( m>1 ) {
hrSize = dec.format(m).concat(" MB");
} else if ( k>1 ) {
hrSize = dec.format(k).concat(" KB");
} else {
hrSize = dec.format(b).concat(" Bytes");
}
return hrSize;
}
Ответ 3
Мне это нравится:
public static String getDynamicSpace(long diskSpaceUsed)
{
if (diskSpaceUsed <= 0) {
return "0";
}
final String[] units = new String[] { "B", "KiB", "MiB", "GiB", "TiB" };
int digitGroups = (int) (Math.log10(diskSpaceUsed) / Math.log10(1024));
return new DecimalFormat("#,##0.#").format(diskSpaceUsed / Math.pow(1024, digitGroups))
+ " " + units[digitGroups];
}
Ответ 4
Проблема в том, что вы используете целочисленное деление. Измените свой код на:
double m = size/1024.0;
double g = size/1048576.0;
double t = size/1073741824.0;
В исходном коде double m = size/1024
разделит целое число size
на 1024
, усечет результат на целое число и только затем преобразует его в double
. Вот почему дробная часть терялась.
Ответ 5
Выполняется целочисленное деление,
i.e., 31/15 приведет к 2, а не 2. безотносительно
просто добавьте номер с помощью D
или D
, который обозначает его как double, и вы будете в порядке
double m = size/1024D;
double g = size/1048576D;
double t = size/1073741824D;
Ответ 6
Нелегко это понять. Рохит Джайн упомянул о целочисленной операции. Также может быть проблемой округление, так как всегда округление может быть нежелательным. Я бы посоветовал найти доступное решение, например, в библиотеке triava.
Он может форматировать числа с произвольной точностью в трех разных системах (SI, IEC, JEDEC) и различных вариантах вывода. Вот несколько примеров кода из тестовых блоков triava:
UnitFormatter.formatAsUnit(1126, UnitSystem.SI, "B");
// = "1.13kB"
UnitFormatter.formatAsUnit(2094, UnitSystem.IEC, "B");
// = "2.04KiB"
Печать точных килограммов, мега значения (здесь с W = Watt):
UnitFormatter.formatAsUnits(12_000_678, UnitSystem.SI, "W", ", ");
// = "12MW, 678W"
Вы можете передать DecimalFormat для настройки вывода:
UnitFormatter.formatAsUnit(2085, UnitSystem.IEC, "B", new DecimalFormat("0.0000"));
// = "2.0361KiB"
Для произвольных операций с кило или мега значениями вы можете разбить их на компоненты:
UnitComponent uc = new UnitComponent(123_345_567_789L, UnitSystem.SI);
int kilos = uc.kilo(); // 567
int gigas = uc.giga(); // 123
Ответ 7
String[] fileSizeUnits = {"bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"};
public String calculateProperFileSize(double bytes){
String sizeToReturn = "";// = FileUtils.byteCountToDisplaySize(bytes), unit = "";
int index = 0;
for(index = 0; index < fileSizeUnits.length; index++){
if(bytes < 1024){
break;
}
bytes = bytes / 1024;
}
System.out.println("Systematic file size: " + bytes + " " + fileSizeUnits[index]);
sizeToReturn = String.valueOf(bytes) + " " + fileSizeUnits[index];
return sizeToReturn;
}
Просто добавьте больше блоков файлов (если они отсутствуют), и вы увидите размер блока до этого устройства (если ваш файл имеет такую большую длину)
Ответ 8
class ConverterUtils{
public static void main(String[] args) {
System.out.println(getSize(1234567));
}
public static String getSize(long size) {
String s = "";
double kb = size / 1024;
double mb = kb / 1024;
double gb = mb / 1024;
double tb = gb / 1024;
if(size < 1024L) {
s = size + " Bytes";
} else if(size >= 1024 && size < (1024L * 1024)) {
s = String.format("%.2f", kb) + " KB";
} else if(size >= (1024L * 1024) && size < (1024L * 1024 * 1024)) {
s = String.format("%.2f", mb) + " MB";
} else if(size >= (1024L * 1024 * 1024) && size < (1024L * 1024 * 1024 * 1024)) {
s = String.format("%.2f", gb) + " GB";
} else if(size >= (1024L * 1024 * 1024 * 1024)) {
s = String.format("%.2f", tb) + " TB";
}
return s;
}
}
Чтобы лучше понять - https://www.techspot.com/news/68482-quickly-convert-between-storage-size-units-kb-mb.html
Ответ 9
Моя базовая версия (вы можете определять некоторые константы вместо вычисления POW все время):
public static String GetFolderSizeHuman(long aBytes)
{
if (aBytes < 1024 * 1024)
return aBytes + " KB";
else if (aBytes < Math.pow(2, 20) * 1024)
return (int) aBytes / Math.pow(2, 20) + " MB";
else if (aBytes < Math.pow(2, 30) * 1024 )
return kGbTbFormatter.format(aBytes / Math.pow(2, 30)) + " GB";
else if (aBytes < Math.pow(2, 40) * 1024)
return kGbTbFormatter.format(aBytes / Math.pow(2, 40)) + " TB";
else return "N/A (1TB?)";
}
Ответ 10
ответ bickster работает вполне нормально, но проблема заключается в том, что он возвращает результаты, такие как 45.00 Bytes
и 12.00 KB
. На мой взгляд, последние десятичные цифры должны быть удалены, если они являются нулями. Поэтому вместо 45.00 Bytes
и 12.00 KB
вы получаете 45 B
и 12 KB
(обратите внимание, что Bytes
было изменено на B
. Это справедливо только для единообразия, поскольку у нас есть KB, MB и т.д., А не Kilobytes, Мегабайты и т.д.).
private boolean isDouble(double value) {
if (value % 1 == 0) {
Log.d(TAG, "value is " + value + " and is not double");
return false;
} else {
Log.d(TAG, "value is " + value + " and is double");
return true;
}
}
Вышеуказанный метод просто проверяет, имеет ли значение нули в виде десятичных цифр.
private String formatFileSize(long size) {
String hrSize = null;
double b = size;
double k = size/1024.0;
double m = ((size/1024.0)/1024.0);
double g = (((size/1024.0)/1024.0)/1024.0);
double t = ((((size/1024.0)/1024.0)/1024.0)/1024.0);
DecimalFormat dec1 = new DecimalFormat("0.00");
DecimalFormat dec2 = new DecimalFormat("0");
if (t>1) {
hrSize = isDouble(t) ? dec1.format(t).concat(" TB") : dec2.format(t).concat(" TB");
} else if (g>1) {
hrSize = isDouble(g) ? dec1.format(g).concat(" GB") : dec2.format(g).concat(" GB");
} else if (m>1) {
hrSize = isDouble(m) ? dec1.format(m).concat(" MB") : dec2.format(m).concat(" MB");
} else if (k>1) {
hrSize = isDouble(k) ? dec1.format(k).concat(" KB") : dec2.format(k).concat(" KB");
} else {
hrSize = isDouble(b) ? dec1.format(b).concat(" B") : dec2.format(b).concat(" B");
}
return hrSize;
}
Ответ 11
Это отношение к корреляции между электрическим и временным переменным током -------------------------- Постоянный постоянный ток = переменный ток постоянного тока = мертвый ток, также известный как положительный [CN10 ] отрицательный = DC, поэтому он также относится к религии, так что пример, который следует за живым током, есть после смерти Христа или до того, как Бог Христа сказал, пусть будет легкий тип дерьма, странного безумия, держите меня и решите мое уравнение, чтобы DC мертвый ток /= смерть Христа, так что до b там ваша временная шкала, так что до Рождества Христова или около того, поэтому используйте множество причин и переменных, пример y + y = y aka y = Tony+ y = Салли, так что если у Тони были яблоки и Салли взял их тогда (у), иначе ака, равных, может быть, Салли не должна была ебать, взяла Тони парней и Мейби. Бог должен был сказать Адаму и Еве, что яблоки еще не созрели, что все на сегодня, но здесь ключ к путешествию во времени, но помните, что нет такой вещи, как время для Тони, иначе Энтони Лоуэлл Уиллис, пожалуйста, не стесняйтесь связаться со мной по электронной почте или по телефону. Я дебил, не математик, ха-ха, пожалуйста, используйте ваше собственное мнение о В этой теме спасибо