2012-10-25 63 views
23

如果我有一個字符串是一個數學公式,我想將其拆分並計算出來。我知道我可以使用eval()函數來做到這一點,但我很感興趣,如果有另一種方法來做到這一點 - 特別是首先分割字符串。所以,我有類似如何將字符串轉換爲javascript中的數學運算符

var myString = "225 + 15 - 10" 
var newString = myString.split(" "); 

這會變成了mystring到一個數組: 「225」, 「+」, 「15」, 「 - 」, 「10」];我的下一個任務是將所有的奇數字符串轉換爲整數,我想我可以使用parseInt();對於。我的問題是,如何將「+」和「 - 」轉換爲實際的算術運算符?所以最後我剩下一個我可以計算的數學表達式?

這可能嗎?

+0

醜陋的方式將是多個if語句。 – keyser

+2

做一個真正的解析器,否則這個練習是毫無意義的:)這是一篇很好的文章http://parsingintro.sourceforge.net/ – Esailija

+0

除非你有一個特殊的原因,只是'eval'它。 –

回答

50
var math_it_up = { 
    '+': function (x, y) { return x + y }, 
    '-': function (x, y) { return x - y } 
}​​​​​​​; 

math_it_up['+'](1, 2) == 3; 
+0

+1 - 這個很漂亮。 – insertusernamehere

+0

嗨,謝謝你。這將工作 - 但如果整個字符串是由用戶輸入?所以我不能控制字符串內的數字。換句話說,如果這是一個計算器,並且用戶在「225 + 15 - 10」中打出拳頭,那麼我會將字符串分開,並將數字和運算符都轉換爲數學表達式。在您提供的解決方案中 - 我將如何自動替換x和y - 不是手動定義它們? – user1775598

+0

通常我會去解析器的方向(上面提到的@Esailija),但問題中提供的上下文使這是一個很好的,簡單的解決方案。編輯:爲了完全控制用戶輸入,編寫一個解析器。 – psema4

0

考慮使用isNaN(Number(array[x]))和任何不符合條件的switch

33

JavaScript的eval函數在Oliver Morgan的評論中提到,我只是想清除如何使用eval作爲解決問題的方法。

eval函數接受一個字符串,然後返回該字符串的值作爲數學運算。例如,

eval("3 + 4") 

將返回7 3 + 4 = 7

這有助於你的情況,因爲你有你想你想當作數學運算符和操作數的字符串數組他們代表。

myArray = ["225", "+", "15", "-", "10"]; 

沒有將任何的字串的數組爲整數或經營者,你可以寫

eval(myArray[0] + myArray[1] + myArray[2]); 

這將轉化爲

eval("225" + "+" + "15"); 

這將轉化爲

eval("225 + 15"); 

這將返回240,加入225的值設定爲15。

或甚至更多的通用:

eval(myArray.join(' ')); 

這將轉化爲

eval("225 + 15 - 10"); 

將返回230,增加的值15到225和減去10.所以你可以看到,在你的情況下,可能會跳過將數組中的字符串轉換爲整數和運算符,正如奧利弗摩根所說,它只是eval它。

+0

我想在表單驗證中使用一些「mathy」表達式,解析器只是矯枉過正。使用'eval()',我可以簡單地解析一些字符串,例如'<| oh'以進行驗證(其中'oh'引用另一個表單輸入類/ id /等)。 – pspahn

+1

但是不要太多地使用eval()。有幾個原因: https://24ways.org/2005/dont-be-eval –

+0

切勿使用eval。爲了任何東西。這是JS中的一個巨大的安全漏洞。 – Daut

相關問題