2016-10-04 5 views
0

Это похоже на question I asked yesterday, но ответ, который я получил, похоже, не работает в этом случае.Выбор единиц измерения MeasurementFormatter

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

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 вариант, который ответил на мой предыдущий вопрос здесь не поможет. Я думаю, что это ограничение рамки, но мне интересно, есть ли у кого-то обходной путь.

ответ

1

Просто создайте двойное расширение, чтобы преобразовать единицы измерения метров в ноги. Затем просто использовать 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" 
2

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

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

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

Смежные вопросы