2009-10-01 8 views
8

J'utilise Objective-C et j'essaie de définir une équation qui est stockée dans un NSString pour être évaluée et stockée dans un NSInteger.NSString à l'équation

quelque chose de semblable à ce qui suit:

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

puis évaluer que pour devenir 31 et le stocker dans un NSInteger. Des idees pour faire cela?

+0

Dans quelle langue est l'expression? Est-il toujours constant ou contient-il des variables? – nall

Répondre

22

Vous voulez le merveilleux, incroyable et fabuleux GCMathParser, disponible (GRATUIT!) Sur apptree.net: http://apptree.net/parser.htm Il fait exactement ce que vous demandez, et vous permet même de faire des substitutions variables (3x + 42, évaluer avec x = 7). Il a même le soutien pour les fonctions mathématiques comme sin(), cos(), tan(), leurs inverses, dtor(), log(), ....

modifier longtemps plus tard ...

Alors que GCMathParser est assez génial, il a le défaut de ne pas être extensible. Donc, si vous avez besoin d'une fonction qui ne supporte pas nativement, alors c'est dommage. J'ai donc décidé de faire quelque chose à ce sujet, et est venu avec un analyseur de mathématiques entièrement natif et évaluateur: http://github.com/davedelong/DDMathParser

+0

exactement ce dont j'avais besoin thatnks! –

+0

Doux! Je n'ai jamais entendu parler de GCMathParser auparavant. – NSResponder

+0

Cela a l'air génial. +1 – Daniel

19

Vous pouvez utiliser le système sous-jacente:

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 c'est vraiment intelligent! J'aime comment vous ajoutez le "== 42" pour pouvoir le décomposer en expressions. Est-ce que cela supporte des fonctions mathématiques comme sin(), cos(), etc? –

+0

C'est vraiment intéressant. Je n'avais aucune idée que tu pouvais faire ça. Notez que vous devrez peut-être lancer pred comme NSComparisonPredicate (NSExpression * exp = [(NSComparisonPredicate *) pred leftExpression];) pour éviter les avertissements du compilateur. –

+2

Malheureusement, selon le Predicate Programming Guide, les seules fonctions supportées au-delà de l'arithmétique de base sont sum, count, min, max, moyenne, médiane, mode, stddev, sqrt, log, ln, exp, sol, plafond, abs, trunc, random, randomn, et maintenant. Donc pas de trigonométrie, je suppose. –

7

J'utiliser sur iPhone pour évaluer une équation . Il est plus simple, vous n'avez pas besoin de créer un NSPredicate, juste le NSExpression:

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

Et voici la documentation aux fonctions analysables compatibles: “BNF Definition of Cocoa Predicates”

Code partagé dans Gist here

+2

+1 l'option '+ expressionWithFormat:' a été ajoutée sous Mac OS 10.6 et iOS 4.0. –