2009-10-01 11 views
8

Estoy usando Objective-C y estoy tratando de establecer una ecuación que se almacena en un NSString para ser evaluado y almacenado en un NSInteger.NSString a la ecuación

algo similar a lo siguiente:

equation = [[NSString alloc] initWithString:@"1+5*6"]; 

y luego evaluar que para convertirse en 31 y almacenarlo en un NSInteger. ¿Alguna idea de como hacer esto?

+0

¿En qué idioma está la expresión? ¿Es siempre constante o contiene variables? – nall

Respuesta

22

Desea el maravilloso, sorprendente y fabuloso GCMathParser, disponible (¡GRATIS!) En apptree.net: http://apptree.net/parser.htm Hace exactamente lo que está pidiendo, e incluso le permite hacer sustituciones variables (3x + 42, evaluar con x = 7). Incluso tiene soporte para funciones matemáticas como sin(), cos(), tan(), sus inversos, dtor(), log(), ....

editar mucho tiempo después ...

Mientras que GCMathParser es bastante impresionante, tiene la falla de no ser extensible. Por lo tanto, si necesita una función que no admite de forma nativa, es una pena. Así que decidí hacer algo al respecto, y se acercó con un analizador de matemáticas totalmente nativo y evaluador: http://github.com/davedelong/DDMathParser

+0

exactamente lo que necesitaba thatnks! –

+0

¡Dulce! Nunca escuché acerca de GCMathParser antes. – NSResponder

+0

Esto se ve genial. +1 – Daniel

19

Se puede utilizar el sistema de predicado:

NSString *equation = @"1+5*6"; 

// dummy predicate that contains our expression 
NSPredicate *pred = [NSPredicate predicateWithFormat: 
         [equation stringByAppendingString:@" == 42"]]; 
NSExpression *exp = [pred leftExpression]; 
NSNumber *result = [exp expressionValueWithObject:nil context:nil]; 
NSLog(@"%@", result); // logs "31" 
+0

+1 ¡eso es realmente inteligente! Me gusta cómo agrega el "== 42" para poder descomponerlo en expresiones. ¿Admite esto funciones matemáticas como sin(), cos(), etc.? –

+0

Esto es realmente interesante. No tenía idea de que pudieras hacer eso. Tenga en cuenta que es posible que necesite convertir pred como un NSComparisonPredicate (NSExpression * exp = [(NSComparisonPredicate *) pred leftExpression];) para evitar advertencias del compilador. –

+2

Desafortunadamente, de acuerdo con la Guía de programación Predicate, las únicas funciones admitidas más allá de la aritmética básica son suma, recuento, mínimo, máximo, promedio, mediana, modo, stddev, sqrt, log, ln, exp, piso, techo, abs, trunc, aleatorio, aleatorio y ahora. Entonces no trigonometría, supongo. –

7

Tengo utilizar esto en iPhone para evaluar una ecuación . Es más sencillo, que no es necesario crear un NSPredicate, sólo el NSExpression:

NSString *equation = @"floor((19-10)/2)"; 
NSNumber *result = [NSExpression expressionWithFormat:equation]; 
NSLog(@"%@", result); // logs "4" 

Y aquí está la documentación de las funciones parseable compatibles: “BNF Definition of Cocoa Predicates”

código compartido en Gist here

+2

+1 se agregó la opción '+ expressionWithFormat:' en Mac OS 10.6 y iOS 4.0. –