не получается написать функцию с математическими операциями которые передаются строкой

дана функция в которую в качестве переменной передаются цифры и знака:

function str2num('1+3'){}

цифры, которые могут передаваться от 1 до 10 включительно. математические знаки, могут быть +,-,*,/. Результат должен быть округлен до ближайшего целого числа. Если вставить вместо цифры, букву, должна выводится ошибка throw Error.

вот мое решение:

function StrToNum(str){

let arr = str.split('');
let s;
for(let i = 0; i < 1; i++){
  if (arr.includes('+')){
     s = +str[0] + +str[2]
  } else if(arr.includes('-')){
    s = str[0] - str[2]
  } else if(arr.includes('*')){
    s = str[0] * str[2];
  } else if(arr.includes('/')) {
    s = str[0] / str[2];
  } else {
    throw Error('вы ввели неверный символ');
  }
}
return Math.round(s);

}

понимаю, что решено неправильно, но никак не могу додуматься до двух вещей: 1)как исправить функцию, чтобы можно было сложить, например 3+10, или 5 * 10, так как мое решение позволяет проводить операции только с цифрами от 1 до 9 2) как сделать, чтобы при вставке символа, вместо цифры выводило ошибку throw Error.


Ответы (3 шт):

Автор решения: Евгений Колмак

const str = '150/3';

const str2num = str => {
  let string = '';
  let operator = '';
  for (const symbol of str) {
    if (symbol === '+' || symbol === '-' || symbol === '*' || symbol === '/') {
      string += ' ';
      operator = symbol;
    } else {
      string += Number(symbol);
    }
  }

  const arr = string.split(' ');
  if (arr.includes('NaN')) {
    return 'Вы ввели неверный символ';
  }
  const [a, b] = arr;
  let result = 0;
  switch (operator) {
    case '+':
      result = Number(a) + Number(b);
      break;
    case '-':
      result = Number(a) - Number(b);
      break;
    case '*':
      result = Number(a) * Number(b);
      break;
    case '/':
      result = Number(a) / Number(b);
      break;
  }
  
  return Math.round(result);
}



console.log(str2num(str));

→ Ссылка
Автор решения: Алексей Соболев

Всем привет, понимаю что использовать eval нежелательно, но все же как решение задачи -

function str2num(args) {
    let sum = 0;
    try {
        sum = alert(eval(args));
    } catch(err) {
        return alert("Ввели не число");
    }
}
str2num('1+3');

→ Ссылка
Автор решения: Laukhin Andrey

Решение с использованием регулярных выражений:

console.log(str2num('10/3'));

function str2num(str) {
  let match = str.match(/^\s*(\d+)\s*([+\-*/])\s*(\d+)\s*$/);

  if (match !== null) {
    let res  = parseInt(match[1]);
    let val  = parseInt(match[3]);
    let sign = match[2];

    switch (sign) {
      case '+': res += val; break;
      case '-': res -= val; break;
      case '/': res /= val; break;
      case '*': res *= val; break;
    }

    return Math.round(res);
  } else
    throw Error('Вы ввели неверный символ!');
}

→ Ссылка