Нужна помощь со строковым калькулятором на JS
Я сама новичок и мне дали задание написать строчный калькулятор который будет принимать выражения вида '23 - 7 * 34 + 2 / sin30'.
Прогоняю все через цикл по приоритетным знакам и потом беру число до знака и после, после чего совершаю операцию и заменяю в строке старые числа на результат. Понимаю что реализация не самая дешевая,но мне сказали сделать как могу. Первая проблема в том что функция получается чувствительна к пробелам и распознает числа от знаков только если пробелы четко все разделяют. От этого возникает вторая проблема — вычисление синусов-косинусов. Помогите пожалуйста, ибо пока не обладаю такими мозго-ресурсами для решения:cray: |
может лучше присмотреться к eval и Math
https://developer.mozilla.org/ru/doc...l_Objects/eval https://developer.mozilla.org/ru/doc...l_Objects/Math |
С eval и Math будет все намного проще. Правда подозреваю, что это не то, что вам нужно.
Вот такие примеры решает: 23 - 7 * 34 + 2 / Math.sin(30)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<input type="text" id="calc">
<button onclick="calc()">Решить</button>
<div id="result"></div>
<script>
function calc(){
var calc = document.getElementById('calc').value;
var result = document.getElementById('result');
result.innerHTML = eval(calc);
}
</script>
</body>
</html>
|
Цитата:
|
function calc(v){
try{
with(Math){
return eval(v.replace(/[\d\.]+/g, a=>"("+a+")"));
}
}catch(e){
return e.toString();
}
}
alert(calc(prompt("Чего считать?")));
|
"with" запрещен в strict mode, да и eval - не фонтан.
имхо, песочницу лучше соорудить через new Function. Хотя, букв будет больше ) |
Alexandroppolus,
Как через new Function и без with задействовать всё содержимое Math? Всё в window скопировать что-ли? Или изобрести регулярку которая будет детектить куда подставлять префикс "Math."? Не громоздковато ли будет? |
Цитата:
var str = '23 - 7 * 34 + 2 / sin(30)';
var mathKeys = Object.getOwnPropertyNames(Math);
var mathValues = mathKeys.map(function(key) { return Math[key]; });
var result = Function(mathKeys, 'return (' + str + ');').apply(null, mathValues);
alert(result);
|
Я и забыл что можно использовать список аргументов в конструкторе Function :-?
|
| Часовой пояс GMT +3, время: 03:40. |