Заставьте NSMeasurementFormatter получить значение больше 1 с помощью параметра NSMeasurementFormatterUnitOptionsNaturalScale
Если мы поместим значение 100g в NSUnit и используем NSMeasurementFormatterUnitOptionsNaturalScale для получения переведенной строки, результат будет 3,52 унции для британской системы мер. Проблема с метрикой, результат - 0,1 кг, что является хорошим значением, но мне нужно сохранить 100 г. Это для рецепта, и чаще всего оставляют "g", когда значение меньше 1 кг.
При тестировании с помощью счетчиков проблем не существует, 100 м - это 100 м в метрической системе, вероятно, потому, что метр является базовым значением, таким как кг (а не г).
Есть ли способ заставить его иметь значение больше 1 вместо 0,xx?
NSUnitMass *g = [NSUnitMass grams];
NSMeasurement *measurementGramm = [[NSMeasurement alloc] initWithDoubleValue:100 unit:g];
NSMeasurementFormatter *formatter = [[NSMeasurementFormatter alloc] init];
[formatter setUnitOptions:NSMeasurementFormatterUnitOptionsNaturalScale];
NSLog(@"NSMeasurementFormatterUnitOptionsNaturalScale ---------- %@", [formatter stringFromUnit:g]);
1 ответ
Чтобы упростить задачу, я предполагаю, что сохраненное значение основано на кг.
NSMeasurement *measurement = [[NSMeasurement alloc] initWithDoubleValue:0.1 unit:NSUnitMass.kilograms];
NSLog(@"Measurement value = %@", measurement);
NSLog
результат
Measurement value = <NSMeasurement: 0x28028ada0> value: 0.100000 unit: kg
Здесь мы видим, что у нас есть значение 0.1
и единица в kg
.
Это для рецепта, и чаще всего оставляют "g", когда значение меньше 1 кг.
Мы можем преобразовать unit
если value
ниже 1
NSMeasurementFormatter *formatter = [[NSMeasurementFormatter alloc] init];
NSLog(@"Locale (KG) measurement value = %@", [formatter stringFromMeasurement:measurement]);
if (measurement.doubleValue < 1.0) {
NSLog(@"Locale (G) measurement value = %@", [formatter stringFromMeasurement:[measurement measurementByConvertingToUnit:NSUnitMass.grams]]);
} else {
NSLog(@"Locale (KG) measurement value = %@", [formatter stringFromMeasurement:measurement]);
}
NSLog
результат
Locale (KG) measurement value = 0,1 kg
Locale (G) measurement value = 0,1 kg
Результат все еще в kg
, это вызвано unitOptions
По умолчанию, если unitOptions установлен на пустой набор, форматировщик будет делать следующее:
- килокалории могут быть отформатированы как "C" вместо "ккал" в зависимости от локали.
- kmPerHour может быть отформатирован как "мили в час" для регионов США и Великобритании, но "километры в час" для других регионов.
Нам просто нужно изменить это
formatter.unitOptions = NSMeasurementFormatterUnitOptionsProvidedUnit;
if (measurement.doubleValue < 1.0) {
NSLog(@"Locale (G) measurement value = %@", [formatter stringFromMeasurement:[measurement measurementByConvertingToUnit:NSUnitMass.grams]]);
} else {
NSLog(@"Locale (KG) measurement value = %@", [formatter stringFromMeasurement:measurement]);
}
NSLog
результат
Locale (G) measurement value = 100 g
Полный код
NSMeasurement *measurement = [[NSMeasurement alloc] initWithDoubleValue:0.1 unit:NSUnitMass.kilograms];
NSLog(@"Measurement value = %@", measurement);
NSMeasurementFormatter *formatter = [[NSMeasurementFormatter alloc] init];
NSLog(@"Locale (KG) measurement value = %@", [formatter stringFromMeasurement:measurement]);
if (measurement.doubleValue < 1.0) {
NSLog(@"Locale (G) measurement value = %@", [formatter stringFromMeasurement:[measurement measurementByConvertingToUnit:NSUnitMass.grams]]);
} else {
NSLog(@"Locale (KG) measurement value = %@", [formatter stringFromMeasurement:measurement]);
}
formatter.unitOptions = NSMeasurementFormatterUnitOptionsProvidedUnit;
if (measurement.doubleValue < 1.0) {
NSLog(@"Locale (G) measurement value = %@", [formatter stringFromMeasurement:[measurement measurementByConvertingToUnit:NSUnitMass.grams]]);
} else {
NSLog(@"Locale (KG) measurement value = %@", [formatter stringFromMeasurement:measurement]);
}