我只是在目标c NSString中有这个表达式:@“10 + 5 * 2”。 我想自动解决这个表达式,并找到了解决方案:
UIWebView *webView = [[UIWebView alloc] init];
NSString *result = [webView stringByEvaluatingJavaScriptFromString:expression];
NSLog(@"%@",result);
以上效果很好,但结果却是:20。 实际上这评估“*”首先意味着首先它是5 * 2 = 10 + 10。 但我想删除这个优先级,只是希望每个运算符从左到右具有相同的优先级,以便答案可以是10 + 5 = 15 * 2 = 30.
虽然编写自己的函数是最后一个选项,但我真的不想弄乱字符串函数。我想使用内置的东西。
谢谢,
** * ** * * 工作解决方案 * ** * ****
感谢您对Eiko和Ozair的所有帮助! 基于他们的答案,我写了一堆代码,对我来说非常合适!
NSString *expression = lblBox.text; // Loads the original expression from label.
expression = [expression stringByReplacingOccurrencesOfString:@"+" withString:@")+"];
expression = [expression stringByReplacingOccurrencesOfString:@"-" withString:@")-"];
expression = [expression stringByReplacingOccurrencesOfString:@"*" withString:@")*"];
expression = [expression stringByReplacingOccurrencesOfString:@"/" withString:@")/"];
NSUInteger count = 0, length = [expression length];
NSRange range = NSMakeRange(0, length);
while(range.location != NSNotFound)
{
range = [expression rangeOfString: @")" options:0 range:range];
if(range.location != NSNotFound)
{
range = NSMakeRange(range.location + range.length, length - (range.location + range.length));
count++;
}
}
for (int i=0; i<count; i++) {
expression = [@"(" stringByAppendingString:expression];
}
UIWebView *webView = [[UIWebView alloc] init];
NSString *result = [webView stringByEvaluatingJavaScriptFromString:expression];
[webView release];
NSLog(@"%@ = %@",expression, result);
答案 0 :(得分:6)
不确定它是否与@Ozair Kafray说的相同......
对于附加到字符串的每个运算符,首先添加)
并在开头添加匹配的(
。即。
10
(10 ) +
(10 ) + 5
((10 ) + 5 ) *
((10 ) + 5 ) * 2
确保删除操作符时也要删除括号。
答案 1 :(得分:3)
我知道没有内置的方法可以做到这一点。我想你只需卷起袖子写一个功能。如果您想使用objective-c,请使用NSScanner。
答案 2 :(得分:3)
从您在评论中回答我的问题,您在输入过程中生成字符串。我建议你在每个操作数之后添加一个括号,除了第一个操作数。
因此,您不必在10
之后向字符串添加任何内容,然后添加运算符+
。之后,对于5
的每个操作数,在字符串的开头添加一个右括号)
和一个对应的左括号(
。同样在2
之后。这样您就不必编写自己的任何东西来处理字符串了。