거리를 표시해야하는데, 생각보다 Swift가 괜찮은 걸 지원하지 않는다…
MKDistanceFormatter
라는게 있다해서 사용해봤는데, 반올림이 너무 심하게 돼서 180m ~ 220m 정도가 다 200m 로 표시된다. 반올림 안하는 설정이 있나 찾아봤지만, 없는 것 같다.
Measurement
와 MeasurementFormatter
라는 걸 사용하는 방법도 있는데, 이것도 완전히 맘에 들지는 않는다. 일단 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