2016-10-04 79 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 
    } 
} 

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