Заставьте 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]);
}
Другие вопросы по тегам