programing

파일 크기를 MB, GB 등으로 포맷

shortcode 2022. 9. 25. 15:24
반응형

파일 크기를 MB, GB 등으로 포맷

파일 크기를 적절한 단위를 사용하여 문자열로 표시해야 합니다.

예를들면,

1L ==> "1 B";
1024L ==> "1 KB";
2537253L ==> "2.3 MB"

기타.

나는 이 의 답을 찾았지만 만족스럽지 못했다.

나는 비슷한 단점을 가진 나만의 해결책을 생각해냈다.

private static final long K = 1024;
private static final long M = K * K;
private static final long G = M * K;
private static final long T = G * K;

public static String convertToStringRepresentation(final long value){
    final long[] dividers = new long[] { T, G, M, K, 1 };
    final String[] units = new String[] { "TB", "GB", "MB", "KB", "B" };
    if(value < 1)
        throw new IllegalArgumentException("Invalid file size: " + value);
    String result = null;
    for(int i = 0; i < dividers.length; i++){
        final long divider = dividers[i];
        if(value >= divider){
            result = format(value, divider, units[i]);
            break;
        }
    }
    return result;
}

private static String format(final long value,
    final long divider,
    final String unit){
    final double result =
        divider > 1 ? (double) value / (double) divider : (double) value;
    return String.format("%.1f %s", Double.valueOf(result), unit);
}

주요 문제는 10진 형식 및/또는 문자열에 대한 지식이 부족하다는 것입니다.1024L, 1025L 등을 매핑하고 싶습니다.1 KB보다는1.0 KB.

두 가지 가능성이 있습니다.

  1. Apache Commons나 Google Guava와 같은 공공 도서관에서 즉시 사용할 수 있는 솔루션을 선호합니다.
  2. 존재하지 않는 경우 어떻게 하면 '.0' 부분을 제거할 수 있습니까(문자열 치환 및 regex에 의존하지 않고 직접 할 수 있습니다).
public static String readableFileSize(long size) {
    if(size <= 0) return "0";
    final String[] units = new String[] { "B", "kB", "MB", "GB", "TB" };
    int digitGroups = (int) (Math.log10(size)/Math.log10(1024));
    return new DecimalFormat("#,##0.#").format(size/Math.pow(1024, digitGroups)) + " " + units[digitGroups];
}

최대 1000TB까지 작동하며 프로그램이 짧습니다!

아마 더 많은 행운이 있을 거야java.text.DecimalFormat이 코드로는 충분할 것 같습니다(단, 날개짓만 하면 됩니다).

new DecimalFormat("#,##0.#").format(value) + " " + unit

놀랍지만 루프 기반 알고리즘이 약 10% 더 빠릅니다.

public static String toNumInUnits(long bytes) {
    int u = 0;
    for ( ; bytes > 1024*1024; bytes >>= 10) {
        u++;
    }
    if (bytes > 1024)
        u++;
    return String.format("%.1f %cB", bytes/1024f, " kMGTPE".charAt(u));
}

언급URL : https://stackoverflow.com/questions/3263892/format-file-size-as-mb-gb-etc

반응형