반응형
파일 크기를 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
.
두 가지 가능성이 있습니다.
- Apache Commons나 Google Guava와 같은 공공 도서관에서 즉시 사용할 수 있는 솔루션을 선호합니다.
- 존재하지 않는 경우 어떻게 하면 '.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
반응형
'programing' 카테고리의 다른 글
매개 변수를 사용하여 MariaDB 저장 프로시저 삽입 (0) | 2022.09.25 |
---|---|
휴지 상태에 인수 생성자가 필요하지 않은 이유는 무엇입니까? (0) | 2022.09.25 |
jQuery를 사용하여 이미지 원본 변경 (0) | 2022.09.25 |
부울 모드의 MySQL FullText: 문자열의 일부로 '+'가 포함된 키워드 검색 (0) | 2022.09.25 |
단일 쿼리를 사용하여 여러 날짜 간격당 항목 수 가져오기 (0) | 2022.09.25 |