Заставьте NSMeasurementFormatter получить значение больше 1 с опцией NSMeasurementFormatterUnitOptionsNaturalScale - PullRequest
0 голосов
/ 12 марта 2020

Если мы поместим значение 100g в NSUnit и используем NSMeasurementFormatterUnitOptionsNaturalScale, чтобы получить переведенную строку, результат для системы Imperial составит 3,52 унции. Проблема с Metri c, результат 0,1 кг, что является хорошим значением, но мне нужно сохранить 100 г. Это для рецепта, и чаще всего держать «g», когда значение ниже 1 кг.

Протестировано с метрами, проблема не существует, 100 м - это 100 м в метри c, вероятно, потому что метр базовое значение, например, кг (а не г).

Есть ли способ заставить его иметь значение больше 1 вместо 0, хх?

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 Ответ

0 голосов
/ 12 марта 2020

Чтобы сделать это проще, я предполагаю, что сохраненное значение основано на кг.

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 "вместо" ккал "в зависимости от локали.
  • километровPerHour может быть отформатирован как" миль в час "для США и Великобритании, но" километров в час "для других локалей.

Мы просто должны изменить это

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]);
}
...