Замена через replace, используя регулярки
Необходимо сделать так,что при вводе выражения в строку input выражение вычислялось. Но пользователь вбивает только (к примеру) cos(x), как известно JS вычесляет его только так : Math.cos(x); Вот код но я не могу понять что не так, ни хватает опыта и практики =(
<html> <head> <script type="text/javascript"> function zap(){ var a=document.all.a.value; a=String(document.all.a.value); a.replace(/cos(x)/gi,"Math.cos(x)"); var x=1; a=eval(a); alert(a); } </script> </head> <body> <br><br><br><br> <input type="text" value="10+cos(x)" name="a"> <input type="button" value="запуск" OnClick="zap()"> <br><br> <table id="fig"> <tr> <td></td> <td></td> </tr> </table><br><br><br><br> </body> </html> |
|
Во-первых, скобки - это спец. символы в регулярках и их надо экранировать:
var string = "10+cos(x)"; alert([ /cos(x)/gi.test(string), // false /cos\(x\)/gi.test(string), // true /cos(x)/gi.test("10+cosx") // true ]); Во-вторых, раз уж эвалишь, используй with: <script type="text/javascript"> function zap(){ var source = a.value; var toExecString = "with (Math) return " + source; var result = Function("x", toExecString)(1); alert(result); } </script> <input type="text" value="10+cos(x)" id="a"> <br> <input type="button" value="запуск" OnClick="zap()"> |
<html> <head> <meta charset="windows-1251"> </head> <body> <input type="text" value="10+sin(1)" id="a"> <input type="button" value="запуск" OnClick="zap()"> <script> function zap(){ var a=document.querySelector("#a").value var test=function(){ var re=/\s*(\d+)\s*([-+*\/])\s*(cos|sin)\s*\(\s*(\d+)\s*\)\s*/i if(!re.test(a)) return alert ("NO valid data") var expr=a.match(re), dig=(+expr[1]), operator=expr[2], resultOfFunc=Math[expr[3]](+expr[4]), result=dig+operator+resultOfFunc return eval(result) } alert (test()) } </script> </body> </html> |
Цитата:
|
не так все делается. калькулятор так не сделаешь. можно конечно тупо eval'ом, но лучше сделать по уму. для начала входной текст нужно разбить на токены. потом читаем про обратную польскую нотацию на википедии и создаем расово верный калькулятор.
|
Цитата:
Если надо без эвала, можно вот так сделать: <html> <head> <meta charset="windows-1251"> </head> <body> <input type="text" value="10+sin(1)" id="a"> <input type="button" value="запуск" OnClick="zap()"> <script> function zap(){ var a=document.querySelector("#a").value var test=function(){ var re=/\s*(\d+)\s*([-+*\/])\s*(cos|sin)\s*\(\s*(\d+)\s*\)\s*/i if(!re.test(a)) return alert ("NO valid data") var expr=a.match(re), dig=(+expr[1]), operator=expr[2], resultOfFunc=Math[expr[3]](+expr[4]), sum=function(x, y){return x + y}, mul=function(x, y){return x * y}, div=function(x, y){return x / y}, sub=function(x, y){return x - y}, getResult=function(operator){ return operator(dig, resultOfFunc) } switch(operator){ case "+": return getResult(sum) case "-": return getResult(sub) case "*": return getResult(mul) case "/": return getResult(div) } } alert (test()) } </script> </body> </html> Если писать каждую хуйню вручную, позаниматься числоебством -- это умно, а сократить запись, сделать код лаконичным и выразительным -- это тупо, тогда это вариант для "умных". |
krutoy,
:-? Цитата:
|
рони,
Так и должно быть. Мы же ожидаем, ввод sin или cos вторым подвыражением |
рони,
Я же тут не собирался настоящий калькулятор писать с произвольным синтаксисом, просто накидал прототип решения для частного случая, с подстановкой Math. Можно и любое выражение обработать, но это уже другая история, это будет мини-язык, фактически. Тансляция из текстового поля в JS. Оно мне надо, голову забивать? ТС спрашивал только про Math. Дальше пусть сам думает:) |
Часовой пояс GMT +3, время: 06:57. |