动态地将KB转换为MB,GB,TB

ped*_*dja 14 java double int operation division

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;
    }
Run Code Online (Sandbox Code Playgroud)

这是一种应返回GB,MB,KB或TB大小的方法.输入值以KB为单位.例如1245的结果应该像1.21MB,但我得到的是1.00MB.

bic*_*ter 37

修改后的版本.只调用一次格式.包括"字节".

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;
}
Run Code Online (Sandbox Code Playgroud)


Roh*_*ain 27

你在表演integer division.所以划分的结果也是integer.小数部分被截断.

so, 1245 / 1024 = 1
Run Code Online (Sandbox Code Playgroud)

将您的部门改为floating point division: -

double m = size/1024.0;
double g = size/1048576.0;
double t = size/1073741824.0;
Run Code Online (Sandbox Code Playgroud)

此外,您的比较是错误的.你应该做比较1.

if (m > 1), if (t > 1), if (g > 1)
Run Code Online (Sandbox Code Playgroud)

理想情况下,我会将您的比较改为: -

    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");
    }
Run Code Online (Sandbox Code Playgroud)

您需要先与较高的单位进行比较,然后再移到较低的单位.

  • @pedja:使用`else if`代替`if`代表`m`,`g`和`t`,因为即使是一个小文件也可能是0.00000000001 TB(大于零). (2认同)

Sam*_*isa 11

我喜欢这个:

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];
}
Run Code Online (Sandbox Code Playgroud)


NPE*_*NPE 5

问题是你正在使用整数除法.将您的代码更改为:

double m = size/1024.0;
double g = size/1048576.0;
double t = size/1073741824.0;
Run Code Online (Sandbox Code Playgroud)

在原始代码中,double m = size/1024将整数size除以1024,将结果截断为整数,然后将其转换为double.这就是分数部分迷失的原因.