2011-06-17 14 views
4

我只是在目標c NSString中有這個表達式:@「10 + 5 * 2」。 我想自動解決這個表達和碰到的溶液:簡單的數學表達式從左到右解決目標c

UIWebView *webView = [[UIWebView alloc] init]; 
NSString *result = [webView stringByEvaluatingJavaScriptFromString:expression]; 
NSLog(@"%@",result); 

上述工作良好,但它產生的結果:20 實際上這個評估「*」第一裝置,第一確實5 * 2 = 10 + 10. 但是我想刪除這個優先級,並且只是希望每個運算符從左到右具有相同的優先級,以便答案可以是10 + 5 = 15 * 2 = 30.

雖然編寫自己的函數是最後一個選項,但我真的不想搞亂字符串函數。我想使用內置的東西。

感謝,

** * ** * *工作液* ** * ****

感謝您的幫助Eiko和Ozair! 根據他們的答案,我寫了這一堆代碼,這完全適合我!

NSString *expression = lblBox.text; // Loads the original expression from label. 
    expression = [expression stringByReplacingOccurrencesOfString:@"+" withString:@")+"]; 
    expression = [expression stringByReplacingOccurrencesOfString:@"-" withString:@")-"]; 
    expression = [expression stringByReplacingOccurrencesOfString:@"*" withString:@")*"]; 
    expression = [expression stringByReplacingOccurrencesOfString:@"/" withString:@")/"]; 


    NSUInteger count = 0, length = [expression length]; 
    NSRange range = NSMakeRange(0, length); 

    while(range.location != NSNotFound) 
    { 
     range = [expression rangeOfString: @")" options:0 range:range]; 
       if(range.location != NSNotFound) 
       { 
        range = NSMakeRange(range.location + range.length, length - (range.location + range.length)); 
        count++; 
       } 
    } 

    for (int i=0; i<count; i++) { 
     expression = [@"(" stringByAppendingString:expression]; 
    } 


    UIWebView *webView = [[UIWebView alloc] init]; 
    NSString *result = [webView stringByEvaluatingJavaScriptFromString:expression]; 
    [webView release]; 
    NSLog(@"%@ = %@",expression, result); 
+0

你可以修改字符串還是來自用戶或其他系統? – 2011-06-17 07:37:58

+1

使用括號怎麼樣? – marzapower 2011-06-17 07:38:40

+0

@Ozair:我使用按鈕和標籤創建了這個字符串。 @marzapower:我不想任何括號,這將從左到右評估沒有任何優先。 – necixy 2011-06-17 07:40:24

回答

6

不知道這是否是一樣@Ozair Kafray說...

對於您添加到字符串操作,添加)第一,在開始處添加匹配(。即

10 
(10) + 
(10) + 5 
((10) + 5) * 
((10) + 5) * 2 

只要確保刪除操作符時也要刪除括號。

+0

+1爲插圖! 我希望有一種方法可以在字符串形成後做到這一點。在那兒? – necixy 2011-06-17 08:05:59

+0

如果您不想並行構建,可以用「)運算符」替換每個運算符,然後在開頭添加匹配的數字「(」,如果只有幾個運算符可用,則可能很容易,並且你可以通過比較字符串的長度得到運營商的數量 – Eiko 2011-06-17 08:13:21

+0

真棒的想法 你太棒了 只是想知道如何得到字符串中的運營商數量 任何方式都是另一回事 謝謝, – necixy 2011-06-17 08:24:57

3

沒有內置的方式來做到這一點,我知道。我想你只會捲起袖子寫一個功能。如果你想使用objective-c,那麼使用NSScanner。

+0

感謝您的迴應! 您能否幫我介紹一下NSScanner的工作原理以及如何在情況下提供幫助? – necixy 2011-06-17 07:45:05

+0

與往常一樣,Apple的文檔在解釋它時做得更好,然後我可以:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/Scanners.html#// apple_ref/doc/uid/20000147-BCIEFGHC – sosborn 2011-06-17 08:03:05

3

由於您在回覆我的問題中的評論,您正在輸入過程中生成字符串。我建議你在除第一個操作數之外的每個操作數之後添加一個括號。

因此,在10之後,您不會向字符串添加任何內容,則會添加運算符+。之後,對於每個操作數5添加一個結束括號)和一個對應的開括號(到字符串的開頭。同樣在2之後。這樣你就不必編寫自己的任何東西來處理字符串。

+0

令人驚歎! 但我也使用了刪除鍵,因此在撰寫本文時,我認爲做這個括號可能會導致問題,因此一旦寫入字符串,我就想要它。我希望有一種方法可以在字符串完成後做這個圓括號的工作嗎? – necixy 2011-06-17 08:04:15

+0

不需要第一個操作員的特殊情況。它只會增加不必要的代碼複雜性。 – Eiko 2011-06-17 08:48:16