如何使用Javascript将字符串公式转换为数字值

问题描述:

基本上,我有一个用户可以输入数字的用户输入字段。 他们还希望能够在输入字段中输入方程。如何使用Javascript将字符串公式转换为数字值

类似于“874.45 * 0.825 + 4000”并将其转换为其真实数值。

我找到的所有解决方案都指向了可怕的eval()方法。特别是这是一个用户输入字段,我关注的只是运行eval(“874.45 * 0.825 + 4000”)并希望从后端获得一个数字。

我想我可以做一个Web服务回调服务器(ASP.NET),但恐怕稍微延迟会造成一些用户的挫折感。

有谁知道一个好的技术或现有的图书馆?

+2

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

你真正需要的是这里的“表达式解析器”,因为你试图让用户用一个小领域特定语言来表达自己的价值观。

的基本机制的工作是这样的:

  1. 记号化的表达成符和操作数。

  2. 根据操作顺序(例如,乘法的优先级高于加法),将操作符和操作数推入堆栈。

  3. 从堆栈中弹出操作数并将中间结果推回堆栈。重复,直到堆栈为空。

我在整个项目中为不同的“小语言”做了这么多次。但从来没有在JavaScript。所以我不能直接推荐一个合适的解析库。

但是一个快速的谷歌搜索显示“PEG.js”。看看这里:

http://pegjs.majda.cz/

他们所有的文档中的例子是正是一种“表达式解析器”你想建立的。

简单地乘以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

在这种情况下,eval有什么错?

至于我完全适合你的任务。如果你想屏蔽掉其执行上下文,那么你可以定义功能,如:

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

,并在您需要解释字符串中使用它。简单而有效。

我认为如果你解析结果字符串并验证它的内容只是数字和运算符,并通过伪造外部范围变量(如文档等)为'var document = null'来执行评估,则eval可能构成较小的安全风险。