Ios 使用测量格式选择单位

Ios 使用测量格式选择单位,ios,swift3,measurementformatter,nsmeasurementformatter,Ios,Swift3,Measurementformatter,Nsmeasurementformatter,这与a相似,但我得到的答案在这种情况下似乎不起作用 我从核心位置得到高度值,单位为米。我想以本地化的形式显示这些内容。举个例子,我现在所在的高度是海拔1839米。这应显示为6033英尺。我能用MeasurementFormatter做的最好的是“1.143mi” 回答我前面问题的.naturalScale选项在这里没有帮助。我认为这是框架的一个限制,但我想知道现在是否有人有解决办法。我认为你是对的,没有办法指定这种上下文。你可以这样做: extension MeasurementFormatte

这与a相似,但我得到的答案在这种情况下似乎不起作用

我从核心位置得到高度值,单位为米。我想以本地化的形式显示这些内容。举个例子,我现在所在的高度是海拔1839米。这应显示为6033英尺。我能用
MeasurementFormatter
做的最好的是“1.143mi”


回答我前面问题的
.naturalScale
选项在这里没有帮助。我认为这是框架的一个限制,但我想知道现在是否有人有解决办法。

我认为你是对的,没有办法指定这种上下文。你可以这样做:

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
    }
}
扩展测量格式
{
func altitudeString(来自测量:测量)->字符串
{
var测量=测量
让unitOptions=self.unitOptions
让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
测量.换算(单位长度.英尺)
self.unitOptions=.provideUnit
string=self.string(from:measurement)
}
else if string.contains(self.string(from:UnitLength.km))
{
self.unitStyle=unitStyle
测量.换算(单位长度.米)
self.unitOptions=.provideUnit
string=self.string(from:measurement)
}
其他的
{
self.unitStyle=unitStyle
string=self.string(from:measurement)
}
self.unitOptions=unitOptions
返回字符串
}
}

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

您只需将单位长度从米转换为英尺。您还可以根据需要创建自定义美国度量格式化程序以显示它:

extension Measurement where UnitType == UnitLength {
    private static let usFormatted: MeasurementFormatter = {
       let formatter = MeasurementFormatter()
        formatter.locale = Locale(identifier: "en_US")
        formatter.unitOptions = .providedUnit
        formatter.numberFormatter.maximumFractionDigits = 0
        formatter.unitStyle = .long
        return formatter
    }()
    var usFormatted: String { Measurement.usFormatted.string(from: self) }
}

游乐场

let value: Double = 1839
let meters: Measurement<UnitLength> = .init(value: value, unit: .meters)
let feet = meters.converted(to: .feet)
let formatted = feet.usFormatted
print(formatted)    // "6,033 feet"\n
let值:Double=1839
let meters:Measurement=.init(值:值,单位:米)
让英尺=米。转换为:。英尺
let formatted=feet.usFormatted
打印(格式化)/“6033英尺”\n

我相信您也可以在不使用扩展名的情况下使用以下命令来完成此操作:
让localizedString=measurementFormatter.string(from:Measurement(value:meters,unit:meters)。converted(to:.feet))
let value: Double = 1839
let meters: Measurement<UnitLength> = .init(value: value, unit: .meters)
let feet = meters.converted(to: .feet)
let formatted = feet.usFormatted
print(formatted)    // "6,033 feet"\n