[Swift] Distance Formatter

거리를 표시해야하는데, 생각보다 Swift가 괜찮은 걸 지원하지 않는다…

MKDistanceFormatter 라는게 있다해서 사용해봤는데, 반올림이 너무 심하게 돼서 180m ~ 220m 정도가 다 200m 로 표시된다. 반올림 안하는 설정이 있나 찾아봤지만, 없는 것 같다.

MeasurementMeasurementFormatter 라는 걸 사용하는 방법도 있는데, 이것도 완전히 맘에 들지는 않는다. 일단 m, km 단위를 쓰려면 강제로 Locale도 지정해야해서 좋지 않아보인다.

그 다음으로 찾은 건 LengthFormatter 를 이용한 방법이었다. 최대한 사칙연산은 빼고 싶었지만, 딱 한 번만 하면돼서 그냥 이걸 사용하기로 했다.

import Foundation

extension Double {
  var prettyDistance: String {
    guard self > -.infinity else { return "?" }

    let formatter = LengthFormatter()
    formatter.numberFormatter.maximumFractionDigits = 2

    if self >= 1000 {
      return formatter.string(fromValue: self / 1000, unit: LengthFormatter.Unit.kilometer)
    } else {
      let value = Double(Int(self)) // 미터로 표시할 땐 소수점 제거
      return formatter.string(fromValue: value, unit: LengthFormatter.Unit.meter)
    }
  }
}
Double(1).prettyDistance => 1 m
Double(10).prettyDistance => 10 m
Double(100).prettyDistance => 100 m
Double(999).prettyDistance => 999 m
Double(1000).prettyDistance => 1 km
Double(1111).prettyDistance => 1.11 km
Double(5555).prettyDistance => 5.56 km
Double(9999).prettyDistance => 10 km
Double(10000).prettyDistance => 10 km
Double(99999).prettyDistance => 100 km
Double(100000).prettyDistance => 100 km
Double(555555).prettyDistance => 555.56 km
Double(999999).prettyDistance => 1,000 km
Double(1000000).prettyDistance => 1,000 km
Double(1234567890).prettyDistance => 1,234,567.89 km