도전과 기원
스택 오버플로에서 인기있는 질문은 다음과 같습니다. java에서 바이트 크기를 사람이 읽을 수있는 형식으로 변환하는 방법 은 무엇입니까? 가장 많이 투표 된 답변에는이 작업을 수행하는 데 매우 유용한 방법이 있지만 이것이 코드 골프이며 더 잘할 수 있습니까?
주어진 바이트 수를 사람이 읽을 수있는 올바른 형식으로 처리하고 결과를 사용자 언어로 표준에 인쇄하는 방법이나 프로그램을 작성하는 것이 어렵습니다. *
* 자세한 설명은 규칙을 참조하십시오!
입력
입력은 항상 최대 (2 ^ 31) -1의 양의 바이트 수입니다.
산출
국제 단위 시스템 또는 이진 표기법을 출력으로 선호하는 경우 선택할 수 있습니다 (SI 표기법으로 인해 일부 바이트가 절약 될 수 있음).
SI: B, kB, MB, GB
Binary: B, KiB, MiB, GiB
참고 : 제한된 입력 범위로 인해 GB 또는 GiB보다 높은 단위는 사용할 수 없습니다.
출력 예
국제 단위 시스템 :
Input Output
0 0.0 B
999 999.0 B
1000 1.0 kB
1023 1.0 kB
1024 1.0 kB
1601 1.6 kB
160581 160.6 kB
4066888 4.1 MB
634000000 634.0 MB
2147483647 2.1 GB
이진 :
Input Output
0 0.0 B
999 999.0 B
1000 1000.0 B
1023 1023.0 B
1024 1.0 KiB
1601 1.6 KiB
160581 156.8 KiB
4066888 3.9 MiB
634000000 604.6 MiB
2147483647 2.0 GiB
규칙
- 바이트 포맷을위한 내장 함수는 허용되지 않습니다!
- 출력은 항상 동일한 표기법 표준이어야합니다. SI 또는 이진을 혼합해서는 안됩니다.
- 결과 숫자가 여전히 1보다 크거나 같은 경우 출력은 항상 가능한 최대 단위 여야합니다.
- 출력은 항상 하나의 십진수를 가져야하지만 결과 출력이 바이트 (B) 일 때 정수를 인쇄하도록 선택할 수 있습니다.
- 숫자와 단위 사이에 공백, 탭 또는 아무것도 추가하지 않을 것인지 선택할 수 있습니다.
- STDIN 또는 기능 매개 변수를 통해 입력이 수신됩니다.
- 출력은 콘솔에 인쇄되거나 문자열 (또는 유사한 문자 컨테이너)로 리턴됩니다.
- 이것은 코드 골프이므로 최단 답변이 이깁니다. 즐기세요!
편집 : 더 많은 설명
일부 숫자는 숫자 999950과 같은 흥미로운 반올림 동작을 갖습니다. 대부분의 코드 구현은 1.0MB 대신 1000.0 kB를 반환합니다. 왜? 999950/1000은 999.950으로 평가되기 때문에 Java에서 String.format을 사용할 때 1000.0으로 효과적으로 반올림됩니다 (대부분의 다른 언어에서도). 이와 같은 경우를 처리하기 위해 추가 점검이 필요합니다.
이 과제에서는 마지막 스타일이 선호되지만 두 스타일 모두 1000.0 kB 및 1.0 MB가 허용됩니다.
의사 코드 / 자바 테스트 코드 :
public static String bytesToSI(long bytes){ if (bytes < 1000){ return bytes + ".0 B"; } //Without this rounding check: //999950 would be 1000.0 kB instead of 1.0 MB //999950000 would be 1000.0 MB instead of 1.0 GB int p = (int) Math.ceil(Math.log(bytes) / Math.log(1000)); if(bytes/Math.pow(1000, p) < 0.99995){ p--; } //Format return String.format("%.1f %sB", bytes/Math.pow(1000, p), "kMGTPE".charAt(p-1)); }
999999과 1000000? 160581전시 반올림, 그래서해야 1000.0kB하고 1.0MB?
kB소문자 k를 사용해야합니다.