19
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で返す必要があるメソッドです。入力値はKB単位です。たとえば、1245の結果は1.21MBのようになりますが、取得するのは1.00MBです。

4

10 に答える 10

45

修正されたバージョン。formatを1回だけ呼び出します。「バイト」を含みます。

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;
}
于 2013-12-13T00:05:15.427 に答える
31

あなたは実行してい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");
    }

最初に上位のユニットと比較してから、下位のユニットに移動する必要があります。

于 2012-11-24T09:16:40.153 に答える
13

これ大好き:

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];
}
于 2017-09-27T14:32:58.050 に答える
5

問題は、整数除算を使用していることです。コードを次のように変更します。

double m = size/1024.0;
double g = size/1048576.0;
double t = size/1073741824.0;

元のコードでは、整数をでdouble m = size/1024除算し、結果を整数に切り捨ててから、に変換します。これが、小数部分が失われていた理由です。size1024double

于 2012-11-24T09:17:33.993 に答える
3

整数除算を実行していますが、

つまり、31/15は2ではなく2になります。

D数字にまたはを追加するだけで、dそれをdoubleとして示します。

double m = size/1024D;
double g = size/1048576D;
double t = size/1073741824D;
于 2012-11-24T09:17:35.807 に答える
3

それを正しくするのは簡単ではありません。Rohit Jainは、整数演算について言及しました。また、常に切り捨てが望ましくない場合があるため、丸めが問題になる可能性があります。triavaライブラリのような利用可能なソリューションを探すことをお勧めします。

3つの異なるシステム(SI、IEC、JEDEC)およびさまざまな出力オプションで任意の精度で数値をフォーマットできます。これがtriavaユニットテストからのいくつかのコード例です:

UnitFormatter.formatAsUnit(1126, UnitSystem.SI, "B");
// = "1.13kB"
UnitFormatter.formatAsUnit(2094, UnitSystem.IEC, "B");
// = "2.04KiB"

正確なキロ、メガ値を印刷します(ここではW =ワット):

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
于 2017-01-05T14:06:43.217 に答える
3
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

于 2018-12-07T13:30:35.747 に答える
2
public class FileSizeCalculator {

    String[] fileSizeUnits = {"bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"};

    public static void main(String[] args) {
        FileSizeCalculator fs = new FileSizeCalculator();
        String properFileSize = fs.calculateProperFileSize(2362232012l);
        System.out.println("Proper file size: " + properFileSize);
    }

    public String calculateProperFileSize(long noOfBytes){
        String sizeToReturn = "";// = FileUtils.byteCountToDisplaySize(bytes), unit = "";
        double bytes = noOfBytes;
        int index = 0;
        for(index = 0; index < fileSizeUnits.length; index++){
            if(bytes < 1024){
                break;
            }
            bytes = bytes / 1024;
        }
        sizeToReturn = String.valueOf(bytes) + " " + fileSizeUnits[index];
        return sizeToReturn;
    }
}

ファイルユニットを追加するだけで(不足している場合)、そのユニットまでのユニットサイズが表示されます(ファイルの長さがそれだけの場合)

于 2015-01-20T13:13:22.960 に答える
0

私の基本バージョン(常に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?)";
}
于 2016-09-28T08:37:59.823 に答える
0

ビックスターの答えはまったく問題なく機能しますが、問題はとのような結果を返すこと45.00 Bytesです12.00 KB。私の意見では、最後の10進数がゼロの場合は、削除する必要があります。したがって、andの代わりに45.00 Bytesand12.00 KBを取得45 Bします(に変更されていることに12 KB注意してください。これは、キロバイト、メガバイトなどではなく、KB、MBなどがあるため均一性のためです)。BytesB

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;
        }
    }

上記の方法は、値に10進数としてゼロがあるかどうかをチェックするだけです。

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;
    }
于 2016-12-09T18:23:53.837 に答える