토이 프로젝트로 피파온라인4 API를 활용한
전적 및 거래내역 조회 앱을 만들고 있었다.
거의 다 완성한 상황인데 골을 넣은 시간(슛을 때린 시간)이
Integer인데 단순히 초라고 생각하고 60을 나눠서 표시했더니
값이 완전 이상해진다.
알고보니 넥슨 측에서 변환식 가이드라인을 제공하고 있었다.
공식 문서
어질어질하다
일단 2의 24승을 구해보자
Math.pow(2.0, 24.0).toInt()
2.0.pow(24.0).toInt()
Math.pow()
를 사용해도 되고
확장함수인 pow()
를 사용해도 무방하다.
일단 2의 24승은 16777216이다.
그리고 위의 변환식을 토대로 함수를 작성해보면 아래와 같다.
private fun convertGoalTime(time: Int) : Int {
val rangeBase = 2.0.pow(24.0).toInt()
return when(time) {
in rangeBase * 0 until rangeBase * 1 -> { // 전반전
time / 60
}
in rangeBase * 1 until rangeBase * 2 -> { // 후반전, rangeBase * 1 차감 후 45 * 60s 더하기
(time - (rangeBase * 1) + (45 * 60)) / 60
}
in rangeBase * 2 until rangeBase * 3 -> { // 연장 전반전, rangeBase * 2 차감 후 90 * 60s 더하기
(time - (rangeBase * 2) + (90 * 60)) / 60
}
in rangeBase * 3 until rangeBase * 4 -> { // 연장 후반전, rangeBase * 3 차감 후 105 * 60s 더하기
(time - (rangeBase * 3) + (105 * 60)) / 60
}
in rangeBase * 4 until rangeBase * 5 -> { // 승부차기, rangeBase * 4 차감 후 120 * 60s 더하기
(time - (rangeBase * 4) + (120 * 60)) / 60
}
else -> { 0 }
}
}
2의 24승 즉, 16777216을 기준으로 전반 ~ 승부차기까지의 범위를 나눠서
변환식을 대입하면 초 단위의 Integer 값을 얻을 수 있다.
여기서 60을 나누면 실제 인게임과 똑같은 분 단위의 시간을 얻을 수 있다.
덤으로 goalTime은 따로 정렬이 안되어있을 때도 있으니
보기좋게 배치하고 싶다면 확장함수인 sortBy
를 사용하여
정렬해주고 배치해주면 더 좋을 거 같다.