Выбор единиц измерения с помощью MeasurementFormatter

Это похоже на вопрос, который я задал вчера, но полученный ответ, похоже, не работает в этом случае.

Я получаю значения высоты в метрах от основного местоположения. Я хочу отобразить их в локализованной форме. Например, высота, на которой я сейчас нахожусь, составляет 1839 м над уровнем моря. Это должно отображаться как 6033 футов. Лучшее, что я могу сделать с MeasurementFormatter "1,143 миль".

let meters : Double = 1839
let metersMeasurement = Measurement(value: meters, unit: UnitLength.meters)

let measurementFormatter = MeasurementFormatter()
measurementFormatter.locale = Locale(identifier: "en_US")

let localizedString = measurementFormatter.string(from: metersMeasurement)

.naturalScale вариант, который ответил на мой предыдущий вопрос, здесь не помогает. Я думаю, что это ограничение структуры, но мне интересно, есть ли у кого-то обходной путь на данный момент.

2 ответа

Решение

Просто создайте двойное расширение, чтобы преобразовать ваши метры в футы. Затем просто используйте MeasurementFormatter, чтобы отобразить его по мере необходимости:

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

Детская площадка

let measurementFormatter = MeasurementFormatter()
measurementFormatter.locale = Locale(identifier: "en_US")
measurementFormatter.unitOptions = .providedUnit
measurementFormatter.numberFormatter.maximumFractionDigits = 0
measurementFormatter.unitStyle = .long

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

localizedString //   // "6,033 feet"

Я думаю, что вы правы, нет никакого способа указать такого рода контекст. Вы могли бы сделать что-то вроде:

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
    }
}

Может быть, есть другие культурно-специфические способы измерения высоты, но это может показаться лучше, чем мили и километры.

Другие вопросы по тегам