2011-05-19 74 views
4

基本上,我有一個用戶可以輸入數字的用戶輸入字段。 他們還希望能夠在輸入字段中輸入方程。如何使用Javascript將字符串公式轉換爲數字值

類似於「874.45 * 0.825 + 4000」並將其轉換爲其真實數值。

我找到的所有解決方案都指向了可怕的eval()方法。特別是這是一個用戶輸入字段,我關注的只是運行eval(「874.45 * 0.825 + 4000」)並希望從後端獲得一個數字。

我想我可以做一個Web服務回調服務器(ASP.NET),但恐怕稍微延遲會造成一些用戶的挫折感。

有誰知道一個好的技術或現有的圖書館?

+2

看看這裏:http://stackoverflow.com/questions/5066824/safe-evaluation-of-arithmetic-expressions-in-javascript – Lazarus 2011-05-19 15:52:02

回答

4

你真正需要的是這裏的「表達式解析器」,因爲你試圖讓用戶用一個小領域特定語言來表達自己的價值觀。

的基本機制的工作是這樣的:

  1. 記號化的表達成符和操作數。

  2. 根據操作順序(例如,乘法的優先級高於加法),將操作符和操作數推入堆棧。

  3. 從堆棧中彈出操作數並將中間結果推回堆棧。重複,直到堆棧爲空。

我在整個項目中爲不同的「小語言」做了這麼多次。但從來沒有在JavaScript。所以我不能直接推薦一個合適的解析庫。

但是一個快速的谷歌搜索顯示「PEG.js」。看看這裏:

http://pegjs.majda.cz/

他們所有的文檔中的例子是正是一種「表達式解析器」你想建立的。

1

簡單地乘以1,它會強制javascript將它視爲一個整數從此。

int = '2343.34' * 1; 
int = input * 1; 
+0

錯了。如果用戶輸入字符串「1 + 1」,那麼你的方法失敗。 – benjismith 2011-05-19 15:48:51

+0

我不認爲你完全理解我的問題。如果用戶輸入'874.45 * 0.825 + 4000'* 1,我會得到結果NaN返回 – taco 2011-05-19 15:49:15

+0

道歉,現在閱讀它。就我所見,您將必須eval()。 – Dunhamzzz 2011-05-19 15:51:45

1

在這種情況下,eval有什麼錯?

至於我完全適合你的任務。如果你想屏蔽掉其執行上下文,那麼你可以定義功能,如:

function calc(str) { 
    var window = null, self = null, document = null; 
    // other globals like: $ = null, jQuery = null, etc. 
    try { return eval(str); } catch(e) {...} 
} 

,並在您需要解釋字符串中使用它。簡單而有效。

1

我認爲如果你解析結果字符串並驗證它的內容只是數字和運算符,並通過僞造外部範圍變量(如文檔等)爲'var document = null'來執行評估,則eval可能構成較小的安全風險。

相關問題