Choosing units with MeasurementFormatter

无人久伴 提交于 2019-11-27 23:21:54

Just create a Double extension to convert your meters unit to feet. Then just use MeasurementFormatter to display it as needed:

extension Double {
    var metersToFeet: Double {
        return Measurement(value: self, unit: UnitLength.meters)
            .converted(to: .feet)
            .value
    }
}

Playground

extension Formatter {
    static let measurement: MeasurementFormatter = {
       let formatter = MeasurementFormatter()
        formatter.locale = Locale(identifier: "en_US")
        formatter.unitOptions = .providedUnit
        formatter.numberFormatter.maximumFractionDigits = 0
        formatter.unitStyle = .long
        return formatter
    }()
}

let meters: Double = 1839
let feet = Measurement(value: meters.metersToFeet, unit: UnitLength.feet)
let localizedString = Formatter.measurement.string(from: feet)

localizedString //   // "6,033 feet"

or as suggested in comments by @Benjamin

let meters: Double = 1839
let measurement = Measurement(value: meters, unit: UnitLength.meters).converted(to: .feet)
let localizedString = Formatter.measurement.string(from: measurement)
print(localizedString)    // "6,033 feet"

I think you are correct there's no way to specify this kind of context. You could do something like:

extension MeasurementFormatter
{
    func altitudeString(from measurement: Measurement<UnitLength>) -> String
    {
        var measurement = measurement
        let unitOptions = self.unitOptions
        let unitStyle = self.unitStyle
        self.unitOptions = .naturalScale
        self.unitStyle = .long
        var string = self.string(from: measurement)
        if string.contains(self.string(from: UnitLength.miles))
        {
            self.unitStyle = unitStyle
            measurement.convert(to: UnitLength.feet)
            self.unitOptions = .providedUnit
            string = self.string(from: measurement)
        }
        else if string.contains(self.string(from: UnitLength.kilometers))
        {
            self.unitStyle = unitStyle
            measurement.convert(to: UnitLength.meters)
            self.unitOptions = .providedUnit
            string = self.string(from: measurement)
        }
        else
        {
            self.unitStyle = unitStyle
            string = self.string(from: measurement)
        }
        self.unitOptions = unitOptions
        return string
    }
}

Maybe there are other culturally specific ways of measuring elevation, but this would seem better than miles and kilometers.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!