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