转换为浮动和计算

Cha*_*har 0 iphone objective-c ios

我有一个包含多个数字和运算符的字符串

@ "5+4-9/10".

如何从中获得结果?

我想在我正在使用的计算器中使用它.按下数字或运算符时,我必须动态显示结果.

我在android中使用了arity jar文件.但我无法在iPhone中实现类似的功能.

The*_*ger 9

那这个呢 -

NSString *formula = @"1+5*6";
NSExpression *exp = [NSExpression expressionWithFormat:formula];
NSNumber *resultForCustomFormula = [exp expressionValueWithObject:nil context:nil];
NSLog(@"%f", [resultForCustomFormula floatValue]);
Run Code Online (Sandbox Code Playgroud)

编辑: 现在,我想对你的要求,并利用由方法NSScanner你不会相信我没有用NSScanner之前Borrrden先生建议我使用它,我发现它真棒.见下面的方法 -

-(NSMutableString *)formatString:(NSString *)formula
{
    // Let's check if there any wrong (.) value exm: 1/.2 or .7+3 
    // 1/0.2 and 0.7+3 are okay but above are incorrect so first fix them

    NSString *str = formula;
    NSInteger c = 0;
    for(int i=0; i<[str length]; i++)
    {

        if([[NSString stringWithFormat:@"%c",[str characterAtIndex:i]] isEqualToString:@"+"] ||
           [[NSString stringWithFormat:@"%c",[str characterAtIndex:i]] isEqualToString:@"-"] ||
           [[NSString stringWithFormat:@"%c",[str characterAtIndex:i]] isEqualToString:@"/"] ||
           [[NSString stringWithFormat:@"%c",[str characterAtIndex:i]] isEqualToString:@"*"])
        {
            if([str length] > i+1)
            {
                if([[NSString stringWithFormat:@"%c",[str characterAtIndex:i+1]] isEqualToString:@"."])
                {
                    formula = [formula stringByReplacingCharactersInRange:NSMakeRange(i+1+c, 1) withString:@"0."];
                    c++;
                }
            }
        }
    }

    // Now we will convert all numbers in float

    NSString *aString;
    float aFloat;
    NSMutableString *formattedString = [[NSMutableString alloc]init];

    NSScanner *theScanner = [NSScanner scannerWithString:formula];
    while ([theScanner isAtEnd] == NO) 
    {

        if([theScanner scanFloat:&aFloat])
        {
            [formattedString appendString:[NSString stringWithFormat:@"%f",aFloat]];
        }

        if([theScanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:&aString])
        {
            [formattedString appendString:aString];
        }
    }
    return formattedString;
}
Run Code Online (Sandbox Code Playgroud)

这将转换(2.222/.4)+ 9999-7 + 0.7*.13 in (2.222000/0.400000)+ 9999.000000-7.000000 + 0.700000*0.130000.
请在使用前调用此方法NSExpression.

NSString *formula = @"(2.222/.4)+9999-7+0.7*.13";
NSString *formattedString = [self formatString:formula];
NSExpression *exp = [NSExpression expressionWithFormat:formattedString];
NSNumber *resultForCustomFormula = [exp expressionValueWithObject:nil context:nil];
NSLog(@"Result = %f", [resultForCustomFormula floatValue]);

//OutPut: Result = 9997.646484
Run Code Online (Sandbox Code Playgroud)

注意:我并不是说它适用于所有公式字符串.可能在某些情况下不起作用.但它将适用于一般方程式.

  • 这种方法的问题在于你试图像解析另一个解析器(`NSExpression`)一样解析字符串.解析很难,并且模仿另一个解析器的尝试通常会失败,至少对于许多输入情况而言.一个例子:@"1/.2".即使你解决了这个案子,我也相信还有其他人.所以问题是你选择的一般方法.这就是我投票的原因. (2认同)
  • @TheTiger我不同意它比其他人更好.这种包含无数隐藏错误的代码是导致项目长期失败的原因.我看到项目因调试成本爆炸而下降.问题的根源是程序员,从表面上看,他们很快就实现了功能,但从未花时间去了解代码的含义. (2认同)