0

我将质量(如 g、mg、μg、ng 和 kg)和体积(如 ml、μl 和 l)作为化学应用程序的输入。

目前,我将所有质量转换为克,将体积转换为升,保存在核心数据中,并以双精度执行任何计算。

最后将结果转换回有意义的单位,即 0.000034 升对我的客户更有用,表示为 34 微升

在不同单位之间工作的最佳实践是什么?

4

2 回答 2

0

那里可能有一些图书馆,但您所做的是特定的,所以我怀疑是否存在特定的“最佳实践”。

但是,您可能想研究 的属性NSDoubleCGFloat因为它们可能更适合跨设备并为您提供更多选项,它们是原始双精度。

没有单位数据类型或许多内置的本机转换器函数。数字是由程序员在应用程序上下文中赋予该数字含义的数字。

于 2013-11-14T05:09:20.373 回答
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;

}

于 2013-11-14T22:54:05.623 回答