Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 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>
Ответить с цитированием
  #2 (permalink)  
Старый 13.11.2014, 15:21
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

ОмаЭль,
ещё один
str.replace, не понимаю механизм глобальной замены
Ответить с цитированием
  #3 (permalink)  
Старый 13.11.2014, 15:27
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 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()">
Ответить с цитированием
  #4 (permalink)  
Старый 13.11.2014, 18:31
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 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.
Ответить с цитированием
  #5 (permalink)  
Старый 13.11.2014, 18:33
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от Sweet
раз уж эвалишь, используй with:
Странная логика. with выпиливают из стандарта, а eval никуда не делся.
Ответить с цитированием
  #6 (permalink)  
Старый 14.11.2014, 03:14
Аватар для Аркадий Укупник
Аспирант
Отправить личное сообщение для Аркадий Укупник Посмотреть профиль Найти все сообщения от Аркадий Укупник
 
Регистрация: 06.09.2014
Сообщений: 41

не так все делается. калькулятор так не сделаешь. можно конечно тупо eval'ом, но лучше сделать по уму. для начала входной текст нужно разбить на токены. потом читаем про обратную польскую нотацию на википедии и создаем расово верный калькулятор.
Ответить с цитированием
  #7 (permalink)  
Старый 14.11.2014, 13:18
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 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>


Если писать каждую хуйню вручную, позаниматься числоебством -- это умно, а сократить запись, сделать код лаконичным и выразительным -- это тупо, тогда это вариант для "умных".
Ответить с цитированием
  #8 (permalink)  
Старый 14.11.2014, 13:24
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

krutoy,

Цитата:
-5 + -5
NO valid data
Ответить с цитированием
  #9 (permalink)  
Старый 14.11.2014, 13:26
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

рони,
Так и должно быть. Мы же ожидаем, ввод sin или cos вторым подвыражением
Ответить с цитированием
  #10 (permalink)  
Старый 14.11.2014, 13:34
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена части url через js NOLDOR123 Общие вопросы Javascript 2 15.05.2013 05:42
Замена <style> через скрипт, разрешение экрана? kabarginbogdan Общие вопросы Javascript 3 26.05.2012 18:15
Метод replace замена спецсимволов eval Общие вопросы Javascript 2 15.02.2011 20:55
Послать форму загруженную через ajax в div используя ajax ncux jQuery 2 16.08.2010 17:36
Как добавить элемент в XML через DOM используя PHP? bayah Серверные языки и технологии 6 11.08.2010 13:33