Нужна помощь со строковым калькулятором на 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, время: 10:57. |