如何使用Javascript将字符串方程转换为数值?

4
基本上,我有一个用户输入字段,用户可以在其中输入数字。他们还希望能够在输入字段中输入方程式。例如“874.45 * 0.825 + 4000”,并将其转换为其真实的数字值。
所有我找到的解决方案都指向可怕的eval()方法。尤其是这是一个用户输入字段,我担心只运行eval("874.45 * 0.825 + 4000")并希望从后端得到一个数字。
我想我可以向服务器(ASP.NET)发出Web服务调用,但我担心稍微延迟会引起用户的不满。
是否有人知道一种好的技术或现有库?

2
请看这里:https://dev59.com/gW445IYBdhLWcg3wDV8P - Lazarus
4个回答

4
你真正需要的是一个“表达式解析器”,因为你正在尝试使用一种小型领域特定语言来允许用户表达他们的值。
基本的机制如下:
1. 将它们的表达式分解成运算符和操作数。 2. 基于运算顺序(例如,乘法比加法具有更高的优先级),将运算符和操作数推入栈中。 3. 从堆栈中弹出操作数并将中间结果推回到堆栈中。重复此过程,直到堆栈为空。
我已经在我的项目中为不同的“小语言”做了无数次。但从未在javascript中。所以我不能直接推荐一个合适的解析库。
但快速搜索发现了“PEG.js”。在这里查看它:

http://pegjs.majda.cz/

他们文档中的所有示例都是针对你正在尝试构建的“表达式解析器”的。


1

只需将其乘以1,它就会强制JavaScript从那时起将其视为整数。

例如

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

错误。如果用户输入字符串“1 + 1”,那么你的方法就失败了。 - benjismith
我认为你没有完全理解我的问题。如果用户输入 '874.45 * 0.825 + 4000' * 1,我将得到 NaN 的结果。 - taco
抱歉,我现在已经阅读了它。据我所知,您将不得不使用eval()。 - Dunhamzzz

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

我认为如果您解析结果字符串并验证其内容仅为数字和运算符,并通过伪造外部作用域变量(如document等)执行评估,那么eval可能会带来较小的安全风险。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接