NSMeasurementFormatter показывает имперские веса, но не метрические веса?

Я реализовал NSMeasurementFormatter и у меня возникла странная проблема. Когда приложение загружается как en_US, я загружаю все свои веса в текстовые поля в фунтах, блестяще. Однако, когда я переключаю свое приложение на en_GB и загружаю те же данные, в текстовых полях ничего не появляется.

Когда я печатаю объекты, на распечатке указываются веса в килограммах, чтобы они правильно конвертировались, но они не загружаются в фактические текстовые поля, чтобы быть видимыми для пользователя.

Есть ли явная причина для этого? Я потратил несколько часов, пытаясь понять, почему это работает для одного места, а не для другого! Цените понимание, вот код:

Вот первоначальное сохранение упражнения, где оно либо идет в одну сторону, либо в другую, в зависимости от настроек приложений на этом этапе.

        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 
}

Поэтому, когда установлено значение US, я получаю показания в фунтах с точностью до 2 десятичных знаков, но когда я устанавливаю значение в ГБ, я ничего не вижу, я просто вижу, как это было выполнено преобразованием в распечатке объекта, фотографии ниже консоли, которая показывает для загрузки как подпрограмм, так и снимков результатов:

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

ОБНОВЛЕНО НИЖЕ С MASSFORMATTER INFO

    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))
    }
}

}

1 ответ

Решение

Все сводится к следующему коду:

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

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

print(formatter.string(from: weight))

Результат пустой String (""). Это очевидная ошибка. Пожалуйста, сообщите об этом.

Простой обходной путь - использование старых 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))
}
Другие вопросы по тегам