2009-10-01 29 views
8

Objective-C kullanıyorum ve biriçinde depolanacak ve bir NSInteger içinde depolanacak bir eşitlik oluşturmaya çalışıyorum. aşağıdakine benzerNSString denklemi

şey: o zaman

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

ve 31 olmak ve bir NSInteger içine depolamak için bunu değerlendirir. bunun nasıl yapıldığına dağir fikri olan?

+0

paylaşılan İfade hangi dilde? Her zaman sabit mi yoksa değişkenler içeriyor mu? – nall

cevap

22

Apptree.net üzerinde harika, şaşırtıcı ve muhteşem GCMathParser, mevcut (ÜCRETSİZ!) Istiyorum: http://apptree.net/parser.htm Tam olarak ne soruyorsun, ve hatta değişken ikameler yapmanızı sağlar (3x + 42, değerlendirmek x = 7 ile). Hatta günah (gibi matematiksel fonksiyonlar için destek), cos() vardır, tan() tersleri, dtor()() log ....

düzenlemek uzun zaman sonra ...

GCMathParser oldukça harika olsa da, genişletilememe kusuru vardır. Yani, doğal olarak desteklemediği bir fonksiyona ihtiyacınız varsa, o zaman çok kötü. Bu yüzden bu konuda bir şeyler yapmaya karar verdi ve tamamen yerli matematik ayrıştırıcı ve değerlendirici ile geldi: http://github.com/davedelong/DDMathParser

+0

tam olarak neye ihtiyacım vardı! –

+0

Sweet! Daha önce GCMathParser'ı hiç duymadım. – NSResponder

+0

Bu harika görünüyor. +1 – Daniel

19

Sen yüklem sistemini kullanabilirsiniz:

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 bu gerçekten zekice! Bunu, ifadelere ayırmak için "== 42" yi nasıl eklediğinizi seviyorum. Bu, sin(), cos(), vb. Gibi herhangi bir matematiksel işlevi destekliyor mu? –

+0

Bu gerçekten ilginç. Bunu yapabileceğiniz hakkında hiçbir fikrim yoktu. Derleyici uyarılarını önlemek için, bir NSComparisonPredicate (NSExpression * exp = [(NSComparisonPredicate *) önceki solExpression];) gibi bir sürüm atamanız gerekebilir. –

+2

Maalesef, Predicate Programlama Rehberine göre, temel aritmetiğin ötesinde desteklenen tek fonksiyonlar toplam, sayım, min, max, ortalama, medyan, mod, stddev, sqrt, log, ln, exp, kat, tavan, abs, trunk, rasgele, rastgele ve şimdi. Yani trigonometri yok sanırım. –

7

Ben bir denklem değerlendirmek için iPhone'da kullanmak zorunda . uyumlu ayrıştırılabilir işlevlerine dokümanlar

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

Ve burada: Bu basittir, bir NSPredicate, sadece NSExpression oluşturmak gerekmez “BNF Definition of Cocoa Predicates”

kod Gist here

+2

+1, '+ expressionWithFormat:' seçeneği Mac OS 10.6 ve iOS 4.0'da eklenmiştir. –