NSMeasurementFormatter显示英制重量但不显示公制重量?

3
我已经实现了一个NSMeasurementFormatter,但是遇到了一个奇怪的问题。当应用程序以en_US为加载语言时,我将所有的重量加载到文本框中作为磅,非常好。然而,当我将我的应用程序切换到en_GB并加载相同的数据时,文本框中没有任何内容显示。
当我打印对象时,打印输出会以kg为单位显示重量,因此它们被正确地转换了,但它们没有加载到实际的文本框中以供用户查看。
这个问题有明显的原因吗?我花了几个小时试图弄清楚为什么它适用于一个位置但不适用于另一个位置!感谢您的洞察力,以下是代码:
以下是对一项练习的初始保存,其中它根据应用程序在此点上的设置而向前或向后进行。
        if self.localeIdentifier == "en_GB" {
            let kgWeight = Measurement(value: Double(self.userExerciseWeight.text!)!, unit: UnitMass.kilograms)
            newUserExercise.weight = kgWeight as NSObject?
            newUserExercise.initialMetricSystem = self.localeIdentifier
            print("SAVED AS \(localeIdentifier) METRIC")
        } else if self.localeIdentifier == "en_US" {
            let lbsWeight = Measurement(value: Double(self.userExerciseWeight.text!)!, unit: UnitMass.pounds)
            newUserExercise.weight = lbsWeight as NSObject?
            newUserExercise.initialMetricSystem = self.localeIdentifier
            print("SAVED AS \(localeIdentifier) IMPERIAL")
        }

然后这里是我的尝试,稍后重新加载此对象的重量属性。
   let formatter = MeasurementFormatter()
    let exerciseWeight = userExercise.weight as! Measurement<Unit>
    let localeIdentifier = UserDefaults.standard.object(forKey: "locale")
    let locale = Locale(identifier: localeIdentifier as! String)
    formatter.locale = locale
    let numberFormatter = NumberFormatter()
    numberFormatter.maximumFractionDigits = 2
    formatter.numberFormatter = numberFormatter

    let finalWeight = formatter.string(from: exerciseWeight)
    cell.todaysExerciseWeightLabel.text = finalWeight 
}

当设置为美国时,我可以看到以两位小数显示的磅数,但当我将其设置为英国时,我看不到任何可见的内容,我只能在对象的输出中看到转换。以下是加载两个例程的控制台和结果截图:enter image description hereenter image description hereenter image description here使用MassFormatter信息进行更新如下:
    let localeIdentifier = UserDefaults.standard.object(forKey: "locale") as! Locale
    let exerciseWeight = userExercise.weight as! Measurement<Unit>
    let formatter = MassFormatter()
    formatter.numberFormatter.locale = localeIdentifier
    formatter.numberFormatter.maximumFractionDigits = 2

    if localeIdentifier.usesMetricSystem {
        let kgWeight = exerciseWeight.converted(to: .kilograms)
        let finalKgWeight = formatter.string(fromValue: kgWeight.value, unit: .kilogram)
        cell.todaysExerciseWeightLabel.text = finalKgWeight
        print(formatter.string(fromValue: kgWeight.value, unit: .kilogram))
    } else {
        let kgWeight = exerciseWeight.converted(to: .pounds)
        let finalLbWeight = formatter.string(fromValue: exerciseWeight.value, unit: .pound)
        cell.todaysExerciseWeightLabel.text = finalLbWeight
        print(formatter.string(fromValue: exerciseWeight.value, unit: .pound))
    }
}

}


这很容易复现,看起来是一个错误。 - Sulthan
1个回答

5
这一切归结为以下代码:

let weight = Measurement(value: 10.0, unit: UnitMass.kilograms)

let formatter = MeasurementFormatter()
formatter.locale = Locale(identifier: "en_GB")

print(formatter.string(from: weight))

结果是一个空的字符串("")。这显然是一个错误,请报告它。
一个简单的解决方法是使用旧的MassFormatter:
//let locale = Locale(identifier: "en_GB")
let locale = Locale(identifier: "en_US")

let weight = Measurement(value: 10.24, unit: UnitMass.pounds)

let formatter = MassFormatter()
formatter.numberFormatter.locale = locale
formatter.numberFormatter.maximumFractionDigits = 2

if locale.usesMetricSystem {
    let kgWeight = weight.converted(to: .kilograms)
    print(formatter.string(fromValue: kgWeight.value, unit: .kilogram))
} else {
    print(formatter.string(fromValue: weight.value, unit: .pound))
}

感谢您添加了批量格式化代码,但我遇到了一些问题,它说在“let kgWeight”行上,“Unit”不是“Dimensions”的子类型。我在这里做错了什么?已将代码添加到OP中。我想现在需要编辑我的exercise.weight对象以符合质量而不是测量设置,对吗? - jwarris91
1
如果您有时间,另一个问题是是否有办法防止“kg”与数字一起加载?例如在这里...让finalKgWeight = formatter.string(fromValue: kgWeight.value, unit: .kilogram),然后设置userExerciseWeight.text = finalKgWeight将在文本框中显示“150 kg”,但我的运动构建器只接受整数,因此“kg”部分会导致应用程序崩溃,我希望它只加载150部分。 - jwarris91
如果您不想显示单位,则使用简单的“NumberFormatter”而不是“MassFormatter”... - Sulthan
谢谢,我会尝试一下。只有在用户编辑对象时,它会在数字后加载单位,这会导致在寻找整数时崩溃。在显示不可编辑数据时,Massformatter 在所有其他情况下都很好。 - jwarris91
1
理论上我仍然需要质量格式化程序吗?因为我可能需要在磅或千克之间转换度量单位,只是显示数字? - jwarris91
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接