如何使用Javascript将字符串公式转换为数字值
基本上,我有一个用户可以输入数字的用户输入字段。 他们还希望能够在输入字段中输入方程。如何使用Javascript将字符串公式转换为数字值
类似于“874.45 * 0.825 + 4000”并将其转换为其真实数值。
我找到的所有解决方案都指向了可怕的eval()方法。特别是这是一个用户输入字段,我关注的只是运行eval(“874.45 * 0.825 + 4000”)并希望从后端获得一个数字。
我想我可以做一个Web服务回调服务器(ASP.NET),但恐怕稍微延迟会造成一些用户的挫折感。
有谁知道一个好的技术或现有的图书馆?
你真正需要的是这里的“表达式解析器”,因为你试图让用户用一个小领域特定语言来表达自己的价值观。
的基本机制的工作是这样的:
记号化的表达成符和操作数。
根据操作顺序(例如,乘法的优先级高于加法),将操作符和操作数推入堆栈。
从堆栈中弹出操作数并将中间结果推回堆栈。重复,直到堆栈为空。
我在整个项目中为不同的“小语言”做了这么多次。但从来没有在JavaScript。所以我不能直接推荐一个合适的解析库。
但是一个快速的谷歌搜索显示“PEG.js”。看看这里:
他们所有的文档中的例子是正是一种“表达式解析器”你想建立的。
简单地乘以1,它会强制javascript将它视为一个整数从此。
如
int = '2343.34' * 1;
int = input * 1;
错了。如果用户输入字符串“1 + 1”,那么你的方法失败。 – benjismith 2011-05-19 15:48:51
我不认为你完全理解我的问题。如果用户输入'874.45 * 0.825 + 4000'* 1,我会得到结果NaN返回 – taco 2011-05-19 15:49:15
道歉,现在阅读它。就我所见,您将必须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可能构成较小的安全风险。
看看这里:http://*.com/questions/5066824/safe-evaluation-of-arithmetic-expressions-in-javascript – Lazarus 2011-05-19 15:52:02