我正在服用质量(g,mg,μg,ng& kg)和体积(ml,μl和l)作为化学应用的输入。
目前,我将所有质量转换为克数和体积为升,保存在核心数据中并执行任何计算作为双精度数。
最后,结果将转换回有意义的单位 即0.000034litres对我的客户来说更有用,表示为34μl
在不同单位之间工作的最佳做法是什么?
答案 0 :(得分:0)
可能有一些库,但你正在做的是具体的,所以我怀疑有一个特定的“最佳实践”。
您可能需要调查NSDouble
,CGFloat
的属性,因为它们可能更适合跨设备,并为您提供更多选项,原始的双倍。
没有单元数据类型或许多内置本机转换器功能。数字是一个数字,由程序员根据应用程序的上下文赋予该数字。
答案 1 :(得分:0)
我在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;
}