是否有用于SI单位计算的IOS框架

时间:2013-11-14 05:01:19

标签: ios

我正在服用质量(g,mg,μg,ng& kg)和体积(ml,μl和l)作为化学应用的输入。

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

最后,结果将转换回有意义的单位 即0.000034litres对我的客户来说更有用,表示为34μl

在不同单位之间工作的最佳做​​法是什么?

2 个答案:

答案 0 :(得分:0)

可能有一些库,但你正在做的是具体的,所以我怀疑有一个特定的“最佳实践”。

您可能需要调查NSDoubleCGFloat的属性,因为它们可能更适合跨设备,并为您提供更多选项,原始的双倍。

没有单元数据类型或许多内置本机转换器功能。数字是一个数字,由程序员根据应用程序的上下文赋予该数字。

答案 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;

}