我将质量(如 g、mg、μg、ng 和 kg)和体积(如 ml、μl 和 l)作为化学应用程序的输入。
目前,我将所有质量转换为克,将体积转换为升,保存在核心数据中,并以双精度执行任何计算。
最后将结果转换回有意义的单位,即 0.000034 升对我的客户更有用,表示为 34 微升
在不同单位之间工作的最佳实践是什么?
我将质量(如 g、mg、μg、ng 和 kg)和体积(如 ml、μl 和 l)作为化学应用程序的输入。
目前,我将所有质量转换为克,将体积转换为升,保存在核心数据中,并以双精度执行任何计算。
最后将结果转换回有意义的单位,即 0.000034 升对我的客户更有用,表示为 34 微升
在不同单位之间工作的最佳实践是什么?
那里可能有一些图书馆,但您所做的是特定的,所以我怀疑是否存在特定的“最佳实践”。
但是,您可能想研究 的属性NSDouble
,CGFloat
因为它们可能更适合跨设备并为您提供更多选项,它们是原始双精度。
没有单位数据类型或许多内置的本机转换器函数。数字是由程序员在应用程序上下文中赋予该数字含义的数字。
我在https://github.com/dhoerl/EngineeringNotationFormatter找到了合适的工程格式化程序
另外我创建了一个简单的版本:
-(NSString *)engineeringFormat:(double)value digits:(int)digits {
//calculate exponent in step of 3
int perMill = trunc(log10(value)/3);
if (value<1) {
perMill -= 1;
}
//calculate mantissa format range of 1 to 1000
double corrected = value;
while (corrected<1) {
corrected = corrected*1000;
}
while (corrected>=1000) {
corrected=corrected/1000;
}
//format number of significant digits
NSNumberFormatter *numberFormatDigits = [[NSNumberFormatter alloc] init];
numberFormatDigits.usesSignificantDigits = YES;
numberFormatDigits.maximumSignificantDigits = digits;
NSString *mantissa = [numberFormatDigits stringFromNumber:[NSNumber numberWithDouble:corrected]];
//select engineering notation prefix
NSArray *engSuffix = @[@"T",@"G",@"M",@"k",@"",@"m",@"µ",@"n",@"p"];
int index = 4 - perMill;
NSString *result;
if ((index > engSuffix.count-1) || (index<0)) {
result = @"Out of range";
} else {
result = [NSString stringWithFormat:@"%@ %@",mantissa,[engSuffix objectAtIndex:index]];
}
return result;
}