How about this -
NSString *formula = @"1+5*6"; NSExpression *exp = [NSExpression expressionWithFormat:formula]; NSNumber *resultForCustomFormula = [exp expressionValueWithObject:nil context:nil]; NSLog(@"%f", [resultForCustomFormula floatValue]);
EDIT: Now I thought about your requirement and made a method using NSScanner
. You wonโt believe that I didnโt use NSScanner
until Mr. Borrrden suggested I use it, and I found it wonderful. See below method -
-(NSMutableString *)formatString:(NSString *)formula { // Let 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; }
This will convert (2.222 / .4) + 9999-7 + 0.7 * .13 to (2.222000 / 0.400000) + 9999.000000-7.000000 + 0.700000 * 0.130000 .
Just call this method before using 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]);
Note. I am not saying that it will work on all lines of the formula. Maybe in some case this will not work. But he will work in general equations.
TheTiger
source share