2016-10-04 28 views
0

這與question I asked yesterday類似,但我得到的答案在這種情況下似乎不起作用。使用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選項回答了我以前的問題在這裏沒有幫助。我認爲這是框架的限制,但我想知道現在是否有人有解決方法。

回答

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

也許有測量高程的其他特定文化的方式,但是這似乎不是英里和公里更好。