ios - 使用 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]);
解决方案
为方便起见,我假设储值基于公斤。
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]);
}
推荐阅读
- python - Blogger API v3 添加搜索说明
- javascript - 反应窗口的问题不会显示结果
- typescript - 如何使用 WebView API 在 VS Code 中打开第 3 方网站?
- laravel - 在 laravel 中使用波斯字符作为 slug
- reactjs - 如何每 10 分钟使用反应钩子获取异步数据
- c - C 程序打印出错误的值
- node.js - 如何处理 mogodb+Nodejs 中的断言错误?
- machine-learning - 数据框重塑以输入 LSTM 模型
- azure-cosmosdb - 如何重新配置 Cosmos 数据库以共享容器吞吐量
- java - S3 选择查询与迭代器来计算 S3 文件的行数?