
13.11.2014, 15:05
|
|
Интересующийся
|
|
Регистрация: 11.10.2014
Сообщений: 18
|
|
|
Замена через 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>
|
|

13.11.2014, 15:21
|
 |
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,155
|
|
|
|
|

13.11.2014, 15:27
|
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Во-первых, скобки - это спец. символы в регулярках и их надо экранировать:
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()">
|
|

13.11.2014, 18:31
|
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
<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>
Последний раз редактировалось krutoy, 13.11.2014 в 18:40.
|
|

13.11.2014, 18:33
|
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
|
Сообщение от Sweet
|
|
раз уж эвалишь, используй with:
|
Странная логика. with выпиливают из стандарта, а eval никуда не делся.
|
|

14.11.2014, 03:14
|
 |
Аспирант
|
|
Регистрация: 06.09.2014
Сообщений: 41
|
|
|
не так все делается. калькулятор так не сделаешь. можно конечно тупо eval'ом, но лучше сделать по уму. для начала входной текст нужно разбить на токены. потом читаем про обратную польскую нотацию на википедии и создаем расово верный калькулятор.
|
|

14.11.2014, 13:18
|
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
|
Сообщение от Аркадий Укупник
|
|
но лучше сделать по уму. для начала входной текст нужно разбить на токены. потом читаем про обратную польскую нотацию на википедии и создаем расово верный калькулятор.
|
Причем тут обратная польская запись?
Если надо без эвала, можно вот так сделать:
<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>
Если писать каждую хуйню вручную, позаниматься числоебством -- это умно, а сократить запись, сделать код лаконичным и выразительным -- это тупо, тогда это вариант для "умных".
|
|

14.11.2014, 13:24
|
 |
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,155
|
|
krutoy,
NO valid data
|
|

14.11.2014, 13:26
|
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
|
рони,
Так и должно быть. Мы же ожидаем, ввод sin или cos вторым подвыражением
|
|

14.11.2014, 13:34
|
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
рони,
Я же тут не собирался настоящий калькулятор писать с произвольным синтаксисом, просто накидал прототип решения для частного случая, с подстановкой Math. Можно и любое выражение обработать, но это уже другая история, это будет мини-язык, фактически. Тансляция из текстового поля в JS. Оно мне надо, голову забивать? ТС спрашивал только про Math. Дальше пусть сам думает 
|
|
|
|