使用MeasurementFormatter选择单位

这类似于我昨天提出的一个问题,但我得到的答案在这种情况下似乎不起作用。

我从Core Location获得了以米为单位的高度值。 我希望以本地化的forms显示这些内容。 例如,我现在的海拔高度是海拔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选项对此没有帮助。 我认为这是框架的限制,但我想知道是否有人现在有一个解决方法。

只需创建一个Double扩展即可将您的仪表单位转换为英尺。 然后只需使用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) -> 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 } } 

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