6

I'm trying to evaluate an expression which contains power, in string as **. i.e. eval("(22**3)/12*6+3/2").The problem is Internet Explorer 11 does not recognizes this and throws syntax error. Which poly-fill I should use to overcome this? Right now I'm using Modernizr 2.6.2.

example equation would be,

((1*2)*((3*(4*5)*(1+3)**(4*5))/((1+3)**(4*5)-1)-1)/6)/7
((1*2)*((3*(4*5)*(1+3)**(4*5))/((1+3)**(4*5)-1)-1)/6)/7*58+2*5
(4*5+4-5.5*5.21+14*36**2+69/0.258+2)/(12+65)

If it is not possible to do this, what are the possible alternatives?

Prajwal
  • 3,930
  • 5
  • 24
  • 50
  • It sounds like you need to write your own parser. Or find one that suits your needs. – Code-Apprentice Jul 11 '17 at 06:13
  • 4
    A polyfill can't help you here because the code is parsed as a syntax error by old browsers. You must transform the code before it's read by the browser as code (preferably server-side using something like Babel) – Denys Séguret Jul 11 '17 at 06:13

4 Answers4

3

You cannot polyfill operators - only library members (prototypes, constructors, properties).

As your operation is confined to an eval call, you could attempt to write your own expression parser, but that would be a lot of work.

(As an aside, you shouldn't be using eval anyway, for very good reasons that I won't get into in this posting).

Another (hack-ish) option is to use a regular expression to identify trivial cases of x**y and convert them to Math.pow:

function detectAndFixTrivialPow( expressionString ) {

    var pattern = /(\w+)\*\*(\w+)/i;

    var fixed = expressionString.replace( pattern, 'Math.pow($1,$2)' );
    return fixed;
}

eval( detectAndFixTrivialPow( "foo**bar" ) );
Dai
  • 141,631
  • 28
  • 261
  • 374
  • Actually, equation is too long. Each equation I'm parsing, contains almost 10-15 variables and 5-10 operators. – Prajwal Jul 11 '17 at 06:14
  • @Prajwal Please post more examples of the expressions you're evaluating then. And note that they are not "equations" because there's no equality being defined or satisfied, they're *expressions*. – Dai Jul 11 '17 at 06:16
  • Edited my question by adding more examples. – Prajwal Jul 11 '17 at 06:23
3

You can use a regular expression to replace the occurrences of ** with Math.pow() invocations:

let expression = "(22**3)/12*6+3/2"
let processed = expression.replace(/(\w+)\*\*(\w+)/g, 'Math.pow($1,$2)');

console.log(processed);
console.log(eval(processed));

Things might get complicated if you start using nested or chained power expressions though.

Robby Cornelissen
  • 91,784
  • 22
  • 134
  • 156
0

I think you need to do some preprocessing of the input. Here is how i would approach this:

  1. Find "**" in string.
  2. Check what is on the left and right.
  3. Extract "full expressions" from left and right - if there is just a number - take it as is, and if there is a bracket - find the matching one and take whatever is inside as an expression.
  4. Replace the 2 expressions with Math.pow(left, right)
K. Kirsz
  • 1,384
  • 10
  • 11
0

You can use Babel online to convert javascript for IE 11.

Alex78191
  • 2,383
  • 2
  • 17
  • 24