我正在设置MeasurementFormatter对象,使用.naturalScale作为unitOptions,使用locale作为度量输出到加拿大。由于某些原因,它在生成字符串时完全跳过厘米。
下面是你可以粘贴到操场上的代码:

import UIKit

let formatter = MeasurementFormatter()
formatter.locale = Locale(identifier: "EN_CA")
formatter.unitOptions = .naturalScale

formatter.string(from: Measurement(value: 2, unit: UnitLength.centimeters))

这里的输出是"0.02 m"而不是预期的"2 cm"
其他示例:
formatter.string(from: Measurement(value: 0.2, unit: UnitLength.centimeters))
formatter.string(from: Measurement(value: 0.1, unit: UnitLength.centimeters))

这输出"0.002 m"然后"1 mm",完全跳过cm。
有没有想过为什么它会跳厘米?这和现场有关系吗?是别的什么东西吗?只是个虫子?
谢谢!

最佳答案

这是一种方法。这有点麻烦,但很管用。

struct DistanceCm {

    init(_ distanceCm: Double) {
        distance = distanceCm
    }

    let formatter = MeasurementFormatter()

    var _distance: Double?
    var distance: Double {

        get {
            return _distance!
        }

        set {
            _distance = newValue
            formatter.locale = Locale(identifier: "EN_CA")

            if (newValue >= 1 && newValue < 100) {
                formatter.unitOptions = .providedUnit
            } else {
                formatter.unitOptions = .naturalScale
            }
        }
    }


    func toString() -> String {
        return formatter.string(from: Measurement(value: _distance!, unit: UnitLength.centimeters))
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    let d1 = DistanceCm(0.1)
    print("\(d1.toString())")

    let d2 = DistanceCm(2.0)
    print("\(d2.toString())")

    let d3 = DistanceCm(200.0)
    print("\(d3.toString())")

    let d4 = DistanceCm(20000.0)
    print("\(d4.toString())")

    let d5 = DistanceCm(200000.0)
    print("\(d5.toString())")
}

输出为:
1 mm
2 cm
2 m
200 m
2 km

我猜格式化程序忽略了“cm”,因为它不是10^3的倍数。国际单位制通常以1000的倍数递增或递减。

关于ios - MeasurementFormatter naturalScale不显示厘米,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43840182/

10-09 08:52