转换为浮点并计算
我有一个string与多个数字和运算符
@ "5+4-9/10"
。
如何从中得到结果?
我想在我使用的计算器内使用它。 当按下数字或操作符时,我将不得不dynamic显示结果。
我在android中使用arity jar文件。 但是我无法在iPhone中实现这样的function。
那这个呢 –
NSString *formula = @"1+5*6"; NSExpression *exp = [NSExpression expressionWithFormat:formula]; NSNumber *resultForCustomFormula = [exp expressionValueWithObject:nil context:nil]; NSLog(@"%f", [resultForCustomFormula floatValue]);
编辑:现在我想你的要求,并提出了使用NSScanner
的方法你不会相信我NSScanner
先生build议我使用NSScanner
,我发现它真棒。 见下面的方法 –
-(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; }
这会将(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
注意:我不是说它可以在所有的公式string中工作。 可能是在某些情况下不起作用。 但它将在一般方程中起作用。
Note that :
您必须至less传递一个浮点值 。
我知道这不是最好的方法,但这样的东西可以为你工作。
NSString *formula = @"5+4-9/10"; NSString *str = [formula lastPathComponent]; formula = [formula stringByReplacingOccurrencesOfString:str withString:[NSString stringWithFormat:@"%@.0",str]]; NSString *strCal=[NSString stringWithString:formula]; NSExpression *exp=[NSExpression expressionWithFormat:strCal]; float result=[[exp expressionValueWithObject:nil context:nil] floatValue]; NSLog(@"result:%f",result);
您可以使用GCMathParser或DDMathParser 。
不知道这是否是最有效的方法,但写了无论如何帮助你… !!!
你可以parsing“所有”数字浮动:
NSMutableString *numericExpression = [NSMutableString stringWithString:@"4+3/2-7/4"]; NSMutableString *nExp=[NSMutableString stringWithString:@""]; BOOL innum=false; BOOL dotfound=false; for (NSInteger charIdx=0; charIdx<numericExpression.length; charIdx++){ NSString *substr=[NSString stringWithFormat:@"%C",[numericExpression characterAtIndex:charIdx]]; if (isdigit([numericExpression characterAtIndex:charIdx])) { // in number innum=true; }else if ([substr isEqualToString:@"."]){ // dot found ... innum=true; dotfound=true; }else{ // not in number if (innum && dotfound) { NSLog(@"all good (*).*"); }else if(innum && !dotfound){ NSLog(@"adding .0"); [nExp appendString:@".0"]; } innum=false; dotfound=false; } [nExp appendString:substr]; NSLog(@"%@",nExp); } NSExpression *expression = [NSExpression expressionWithFormat:nExp]; NSNumber *result = [expression expressionValueWithObject:nil context:nil]; NSLog(@"calc %@ = %@",nExp,result);