¿Cómo evaluar la ecuación de cadena en ios?
objective-c ios5 (6)
¿Hay manera de resolver las ecuaciones de cadena en ios
?
Por ejemplo
Entrada:
NSString * str =@"1+2";
Salida:
NSInteger result = 3
// es decir, suma de 1 + 2 de str
¡Cómo hacer esto y obtener el resultado esperado!
¡Por favor ayuda!
Creo que necesitas subString
tu cadena y almacenar cada número en una nueva NSstring
(integerValue) o en una variable Integer
.
ejemplo:
NSString *str = @"1+2";
int x = [[str substringToIndex:1]integerValue];
int y = [[str substringFromIndex:1]integerValue];
int z = x+y;
NSLog(@"Sum === %d",z);
Depende de la complejidad de las ecuaciones de su cadena de entrada. Puede usar el algoritmo de Shunting-yard para analizar ecuaciones matemáticas y luego calcular la ecuación a partir del Abstract Syntact Tree (AST)
Pero espero que estés buscando alguna solución fácil, preferiblemente ya hecha. En ese caso, puedes probar uno de estos (no hay garantía, no los he probado, solo he buscado en Google):
Lo que puede hacer es, puede obtener los componentes de la cadena separados por el signo "+" utilizando este método y luego obtendrá la matriz de componentes, es decir, 1,2.
NSArray* foo = [str componentsSeparatedByString: @"+"];
int result = [[foo objectAtIndex:0] integerValue] + [[foo objectAtIndex:1] integerValue];
y luego puede usar el valor entero para esos dos elementos y agregarlos y almacenar el resultado en una variable entera.
Puedes usar NSExpression para esto:
NSExpression *expression = [NSExpression expressionWithFormat:@"1+2"];
NSLog(@"%@", [expression expressionValueWithObject:nil context:nil]);
Para más información lea la documentación de los métodos utilizados.
Si sus expresiones matemáticas son lo suficientemente simples, puede seguir la ruta manual como lo sugiere Rajan Balana.
Para evaluar expresiones más complejas, puede usar / abuse de NSPredicate
en combinación con NSExpression
como se describe en esta publicación del blog: http://funwithobjc.tumblr.com/post/1553469975/abusing-nspredicate
Tenga en cuenta que NSPredicate
solo es necesario si su entrada es realmente una ecuación (incluida la parte correcta):
NSPredicate* parsedExpression = [NSPredicate predicateWithFormat:@"1+2=x"];
NSExpression* leftPart = [(NSComparisonPredicate*)parsedExpression leftExpression];
NSNumber* evaluatedResult = [leftPart expressionValueWithObject:nil context:nil];
NSLog(@"Expr:%@", evaluatedResult);
Para lograr un análisis adecuado, puede usar uno de los analizadores matemáticos para Objective-C. Yo no los he usado, pero los populares parecen ser
Utilizar esta :
NSString * str =@"1+2";
NSArray *arr = [str componentsSeparatedByString:@"+"];
int sum = 0;
for (int i = 0; i < [arr count]; i++) {
sum += [[arr objectAtIndex:i] intValue];
}
NSLog(@"sum : %d",sum);
Salida: suma = 6
Puedes usar NSExpression también.
Las expresiones son el núcleo de la implementación del predicado. Cuando se llama a expressionValueWithObject: la expresión se evalúa y se devuelve un valor que luego puede ser manejado por un operador. Las expresiones pueden ser desde constantes hasta invocaciones de métodos. Los escalares deben envolverse en las clases apropiadas de NSValue.
Ejemplo:
NSLog(@"sum : %@", [[NSExpression expressionWithFormat:@"1+4"] expressionValueWithObject:nil context:nil]);
Output :- sum : 5
NSLog(@"mulitple : %@", [[NSExpression expressionWithFormat:@"2*4"] expressionValueWithObject:nil context:nil]);
Output :- mulitple : 8
Espero que te ayude.