在 Java 中将字节大小转换为人类可读的格式?
convert byte size into human readable format in Java?
正在尝试创建静态方法String formatSize(long sizeInBytes)
此方法需要 return 最适合所提供文件大小的表示(以字节为单位)
至少保留 2 位小数(字节除外)的人类可读格式。
这是我的代码
public class HexEditor {
public static void main(String[] args) {
System.out.println(formatSize(2147483647));
System.out.println(formatSize(123));
System.out.println(formatSize(83647));
System.out.println(formatSize(9585631));
System.out.println(formatSize(188900977659375L));
}
public static String floatForm (double d){
return new DecimalFormat("#.##").format(d);
}
public static String formatSize(long size) {
double B = 1 * 8;
double kibit = 1024;
double KiB = B * kibit;
double MiB = KiB * kibit;
double GiB = MiB * kibit;
double TiB = GiB * kibit;
double Pib = TiB * kibit;
if (size < kibit) {
return size + " byte";
} else if (size < KiB) {
double result = size / kibit;
return floatForm (result) + " Kibit";
} else if (size < MiB) {
double result = size / KiB;
return floatForm (result) + " KiB";
} else if (size < GiB) {
double result = size / MiB;
return floatForm (result) + " MiB";
} else if (size < TiB) {
double result = size / GiB;
return floatForm (result) + " GiB";
} else if (size < Pib) {
double result = size / TiB;
return floatForm (result) + " TiB";
}
return "";
}
}
这些是我的输入和期望输出
输入输出
2147483647 2.00 GiB
123 123 bytes
83647 81.69 KiB
9585631 9.14 MiB
188900977659375 171.80 TiB
但是当我的代码运行时它给出了不同的输出
256 MiB
123 byte
10.21 KiB
1.14 MiB
21.48 TiB
我错了吗?什么的
您正在除以位,但您的输入已经 以字节为单位,而不是位。因此,除了 < KB 计算之外,您最终得到的结果都是预期大小计算的 1/8。
试一试以下代码(添加打印语句只是为了完整性检查除数):
double KiB = Math.pow(2, 10);
double MiB = Math.pow(2, 20);
double GiB = Math.pow(2, 30);
double TiB = Math.pow(2, 40);
double Pib = Math.pow(2, 50);
NumberFormat df = DecimalFormat.getInstance();
System.out.println("KiB: " + df.format(KiB));
System.out.println("MiB: " + df.format(MiB));
System.out.println("GiB: " + df.format(GiB));
System.out.println("TiB: " + df.format(TiB));
System.out.println("Pib: " + df.format(Pib));
if (size < KiB) {
return size + " byte";
} else if (size < MiB) {
double result = size / KiB;
return floatForm(result) + " KiB";
/* remaining code is identical to yours */
正在尝试创建静态方法String formatSize(long sizeInBytes)
此方法需要 return 最适合所提供文件大小的表示(以字节为单位)
至少保留 2 位小数(字节除外)的人类可读格式。
这是我的代码
public class HexEditor {
public static void main(String[] args) {
System.out.println(formatSize(2147483647));
System.out.println(formatSize(123));
System.out.println(formatSize(83647));
System.out.println(formatSize(9585631));
System.out.println(formatSize(188900977659375L));
}
public static String floatForm (double d){
return new DecimalFormat("#.##").format(d);
}
public static String formatSize(long size) {
double B = 1 * 8;
double kibit = 1024;
double KiB = B * kibit;
double MiB = KiB * kibit;
double GiB = MiB * kibit;
double TiB = GiB * kibit;
double Pib = TiB * kibit;
if (size < kibit) {
return size + " byte";
} else if (size < KiB) {
double result = size / kibit;
return floatForm (result) + " Kibit";
} else if (size < MiB) {
double result = size / KiB;
return floatForm (result) + " KiB";
} else if (size < GiB) {
double result = size / MiB;
return floatForm (result) + " MiB";
} else if (size < TiB) {
double result = size / GiB;
return floatForm (result) + " GiB";
} else if (size < Pib) {
double result = size / TiB;
return floatForm (result) + " TiB";
}
return "";
}
}
这些是我的输入和期望输出
输入输出
2147483647 2.00 GiB
123 123 bytes
83647 81.69 KiB
9585631 9.14 MiB
188900977659375 171.80 TiB
但是当我的代码运行时它给出了不同的输出
256 MiB
123 byte
10.21 KiB
1.14 MiB
21.48 TiB
我错了吗?什么的
您正在除以位,但您的输入已经 以字节为单位,而不是位。因此,除了 < KB 计算之外,您最终得到的结果都是预期大小计算的 1/8。
试一试以下代码(添加打印语句只是为了完整性检查除数):
double KiB = Math.pow(2, 10);
double MiB = Math.pow(2, 20);
double GiB = Math.pow(2, 30);
double TiB = Math.pow(2, 40);
double Pib = Math.pow(2, 50);
NumberFormat df = DecimalFormat.getInstance();
System.out.println("KiB: " + df.format(KiB));
System.out.println("MiB: " + df.format(MiB));
System.out.println("GiB: " + df.format(GiB));
System.out.println("TiB: " + df.format(TiB));
System.out.println("Pib: " + df.format(Pib));
if (size < KiB) {
return size + " byte";
} else if (size < MiB) {
double result = size / KiB;
return floatForm(result) + " KiB";
/* remaining code is identical to yours */