Выбор единиц измерения с помощью 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
}
}
Может быть, есть другие культурно-специфические способы измерения высоты, но это может показаться лучше, чем мили и километры.