小程序中计算算术表达式
大家都知道 JS 中的 eval 函数可以直接计算出算术表达式的结果(当然它还有更多的实用策略),但是到了微信小程序,把这个函数给割了,所以,折腾无果后,自己写了个,仅供大家参考。
前情提要:
- 微信小程序中 eval 函数被割;
- 网上未找到合适的工具类(尝试用了 rpn.js ,括号嵌套时结果不太满意)。
声明:
- 本文提及的内容均为原创,难免有不规范或不合理的地方,各位海涵。
- 文中所述方案,仅以满足自身需求为目的,所以考虑的不是特别全面,后续完善下。
- 关于JS闭包等操作,此处不涉及,各位看官自行处理;
先说下逻辑:
比如需要计算一个算式是否等于24,这个过程中,算式是字符串拼出来的,是否等于24的关键就是先得出算式的计算结果,比如计算 ‘(13-5)*(9-6)’ :
- 1、传入算式前,确保算式格式正确(因为计算内部没有做严谨的判断);
- 2、优先计算括号内的内容(判断括号内的内容,建议从第一个右括号开始,向前查询最近的一个左括号,这样循环下来,即可保证括号优先计算正常);
- 3、计算加减乘除(去括号后,先计算乘除,后计算加减)。
- 4、其他语言可以参考此思路,自行处理。
遇到的坑
本人JS菜鸟,写这个时候爬坑N多,略记一二。
- 从字符串中提取的数字,做加法计算的时候,需要把字符转成数字,否则会出现‘1’+‘1’ = ‘11’的情况;
- 修改变量名,一定要及时把所有引用的地方都修改好,否则就没有否则了...
- 网上的代码,下下来一定要仔细测试,包括我的代码。
上代码
/**
* By Chice
* Date:20180316
* 2206143885@qq.com
*/
/**计算没有括号的表达式的值(操作符限定为'+'、'-'、'*'、'/') */
function calcExpressionWithoutQuote(expression) {
if ((expression.indexOf('(') > -1) || (express