我正在设置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/