繁体   English   中英

** IE11 不支持运算符。 如何使用代码用 Math.pow 替换它?

[英]** operator not supported in IE11. How to replace it with Math.pow using code?

我有这个示例公式:

((97000 * ((5.50/100)/12)) / (1 - ((1 + ((5.50/100)/12))**(-1 * 120))))

问题是此代码在 IE11 中无法正常工作。 我已经尝试用这种方法用Math.pow替换每个** ,但我无法让它正常工作:

 function detectAndFixTrivialPow(expressionString) { var pattern = /(\\w+)\\*\\*(\\w+)/i; var fixed = expressionString.replace(pattern, 'Math.pow($1,$2)'); return fixed; } var expr = "((97000 * ((5.50/100)/12)) / (1 - ((1 + ((5.50/100)/12))**(-1 * 120))))"; var expr2 = detectAndFixTrivialPow(expr); console.log(expr); console.log(expr2); // no change...

用正则表达式尝试这个会很困难。 而是使用转译器或至少使用 ECMAScript 解析器。

这是一个如何使用 esprima 解析器完成的示例。 这个 API 生成一个 AST 树。 下面的代码在该树中查找**运算符并收集输入字符串应更改的偏移量。 然后这些偏移量按降序排序,以正确的顺序将它们应用于输入字符串。

请注意,此代码不会尝试保存任何括号。 保留输入中的那些,并为每个Math.pow调用添加一个额外的对。

 function convert(input) { let modifs = []; function recur(ast) { if (Object(ast) !== ast) return; // not an object if (ast.type === "BinaryExpression" && ast.operator == "**") { modifs.push( [ast.range[0], 0, "Math.pow("], [input.indexOf("**", ast.left.range[1]), 2, ","], [ast.range[1], 0, ")"] ); } Object.values(ast).forEach(recur); } recur(esprima.parse(expr, { range: true })); modifs.sort(([a], [b]) => b - a); let output = [...input]; for (let params of modifs) output.splice(...params); return output.join(""); } // Demo let expr = "((97000 * ((5.50/100)/12)) / (1 - ((1 + ((5.50/100)/12))**(-1 * 120))))" let result = convert(expr); console.log(result);
 <script src="https://cdn.jsdelivr.net/npm/esprima@4.0.1/dist/esprima.min.js"></script>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM