【发布时间】:2012-03-21 00:22:49
【问题描述】:
我想问如何将用户插入的字符串转换为数学方程,以便 xCode 理解。
例如,如果用户在文本字段中输入此内容。 “2*sin(2*M_PI*t)”,其中等式中的“t”是代码中的一个变量,Xcode 可以理解这个等式
双重答案 = 2*sin(2*M_PI*t);
非常感谢 亲
【问题讨论】:
标签: xcode string math type-conversion equation
我想问如何将用户插入的字符串转换为数学方程,以便 xCode 理解。
例如,如果用户在文本字段中输入此内容。 “2*sin(2*M_PI*t)”,其中等式中的“t”是代码中的一个变量,Xcode 可以理解这个等式
双重答案 = 2*sin(2*M_PI*t);
非常感谢 亲
【问题讨论】:
标签: xcode string math type-conversion equation
你可以只用标准的 cocoa 类来做,但是语法有点荒谬,而且设置的数量也是惊人的。
@interface MyExprTest : NSObject
-(void)run;
@end
@implementation MyExprTest
-(void)run {
NSExpression *e = [(NSComparisonPredicate *)[NSPredicate
predicateWithFormat:@"2*FUNCTION(2*PI*$t,'sin')==0"]
leftExpression];
NSMutableDictionary *vars = [NSMutableDictionary
dictionaryWithObjectsAndKeys:
[NSNumber numberWithDouble:0.04], @"t",
nil];
NSLog(@"%@", [e expressionValueWithObject:self context:vars]);
}
-(double)PI {
return M_PI;
}
@end
@interface NSNumber (Trigonometry)
- (NSNumber*)sin;
@end
@implementation NSNumber (Trigonometry)
- (NSNumber*) sin {
double result = sin([self doubleValue]);
return [NSNumber numberWithDouble:result];
}
@end
int main (int argc, const char * argv[]) {
MyExprTest *t = [[MyExprTest alloc] init];
[t run];
return 0;
}
注意几点:
t 变为$t,以便您可以从vars 字典中引用它M_PI 变成了简单的PI;注意添加的方法来支持它FUNCTION 和一个类别是如何绕过它的。【讨论】:
NSPredicate 的预期。请注意末尾的==0,它是针对缺乏公开可用的表达式解析 API 的解决方法。只有谓词解析器可用,因此您将表达式 2*sin(2*M_PI*t) 转换为谓词 2*sin(2*M_PI*t)==0,并使用 leftExpression 调用获取其左侧部分。
最好的办法是使用像 DDMathParser 这样的数学解析器。
它允许变量替换并具有内置常量。
【讨论】: