본문 바로가기
Android

[Android] 바이트 관련 데이터를 형식에 맞춰 보여주기(파일 크기, 비트 전송률, 샘플링 주파수)

by 준그래머 2023. 10. 26.
반응형

시작

아래 화면처럼 파일 크기, 비트 전송률, 샘플링 주파수를 사용자가 보기 좋게 형식에 맞춰 보여줘야 하는 작업을 하게 되었다.

공통적으로 구현되어야 할 부분과 다르게 구현할 부분만 조금 나눠주면 깔끔하게 구현할 수 있을 것 같다.

 

다른 부분

  1. 상황에 따라 1kb의 크기가 다르다.
    • 파일, 비트 전송률, 샘플링 주파수 모두 1000b를 1kb로 계산할 것이지만 1024b로 계산하는 경우도 존재하니 다른 앱에서 재 사용할 경우를 생각해 구분할 수 있도록 구현할 예정이다.
  2. 보여줘야 할 단위가 각 각 다르다.
    • 파일은 "TB", "GB", "MB", "KB", "B”, 비트 전송률은 "Tbps", "Gbps", "Mbps", "kbps", "bps” 샘플링 주파수는 "THz", "GHz", "MHz", "kHz", "Hz” 단위로 사용하기 때문에 구분되어야 한다.

 

같은 부분

  1. Mega, Giga, Tera 계산 식이 같다.
    • mega는 kilo X kilo, giga는 mega X kilo, tera는 giga X kilo 다.
  2. 단위를 보여 주는 공식이 같다
    • 계산할 value의 값이 tera 보다 크면 tera로 아니면 giga로 큰 값부터 내림차순으로 비교해나가기 때문에 단위를 보여 줄 공식은 동일하다.

 

사이즈 형식 구현하기

형식으로 보여줄 value와 kilo의 바이트 수를 파라미터로 받았다. 예를 들어 1000으로 계산할 것이라면 formatFileSize(10000000, 1000) 으로 호출하면 된다.

public static String formatFileSize(final long value, final long kilo){
    final String[] units = new String[] { "TB", "GB", "MB", "KB", "B" };
    return format(value, kilo, units);
}

// BitRate
// final String[] units = new String[] { "Tbps", "Gbps", "Mbps", "kbps", "bps" };

// SampleRate 
// final String[] units = new String[] { "THz", "GHz", "MHz", "kHz", "Hz" };
// 각 함수에 따라 units만 바꿔서 사용할 수 있도록 했다.

formatFileSize 함수에서는 파일 단위의 배열을 TB 부터 B까지 순서대로 초기화 한 뒤 format 함수로 넘겨주기만 하면 된다.

 

format 함수에서 파라미터로 formatFileSize와 동일한 value, kilo 받고 units 만 추가로 더 받는다.

private static String format(final long value, final long kilo, final String[] units){
    if(value < 1) return String.valueOf(value);
    long mega = kilo * kilo;
    long giga = mega * kilo;
    long tera = giga * kilo;
    final long[] byteUnits = new long[] {tera, giga, mega, kilo, 1 };
    String result = "0";
    for(int i = 0; i < byteUnits.length; i++){
        final long byteUnit = byteUnits[i];
        if(value >= byteUnit){
            String unit = units[i];
            double resultDoubleValue =  byteUnit > 1 ? (double) value / (double) byteUnit : (double) value;
            resultDoubleValue = Math.floor(resultDoubleValue*10)/10;
            if(resultDoubleValue == (long) resultDoubleValue) result = String.format("%.0f %s", resultDoubleValue, unit);
            else result = String.format("%.1f %s", resultDoubleValue, unit);
            break;
        }
    }
    return result;
}
  1. mega부터 tera까지 순서대로 계산한 뒤에 long 배열에 tera부터 내림차순으로 넣는다.
  2. for 반복문을 통해 tera부터 1까지 value의 값과 비교해 value가 크거나 같다면 value를 byteUnit으로 나누도록 한다. 이때 소수점이 필요하기 때문에 double 형으로 변환한 뒤 계산해야 한다.
  3. 계산된 resultDoubleValue 값을 소수점 첫 번째 자리까지 내림으로 잘라낸다. ex) 44.100 이면 → 44.1 로 잘림
  4. 소수점이 0인지 아닌지 확인해보고 0이라면 "%.0f %s" 형식으로 다르면 "%.1f %s" 로 반환 해준다.

 

 

반응형