首页 > 解决方案 > 使用 NSMeasurementFormatterUnitOptionsNaturalScale 选项强制 NSMeasurementFormatter 获得超过 1 的值

问题描述

如果我们将值 100g 放入 NSUnit 并使用 NSMeasurementFormatterUnitOptionsNaturalScale 得到翻译后的字符串,那么英制系统的结果是 3.52 oz。问题在于公制,结果是 0.1 公斤,这是一个很好的价值,但我需要保持 100 克。这是一个食谱,当值低于 1 公斤时,更常见的是保留“g”。

用米测试问题不存在,100m 是公制的 100m 可能是因为米是基本值,如 kg(而不是 g)。

有没有办法强制它的值超过 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]);   

标签: iosobjective-cxcodensmeasurementformatternsmeasurement

解决方案


为方便起见,我假设储值基于公斤。

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

这是一个食谱,当值低于 1 公斤时,更常见的是保留“g”。

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”而不是“kcal”。
  • 对于美国和英国语言环境,kmsPerHour 可能被格式化为“英里/小时”,而对于其他语言环境,可能被格式化为“公里/小时”。

我们只需要改变它

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

推荐阅读