Показать сообщение отдельно
  #4 (permalink)  
Старый 15.11.2011, 01:15
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

А вот меня заинтересовало...

<script>
function calculate(str) {
var was_str;
var sum_or_diff=function(sub, a, sign, b) {
 return sign=="-" ? a-b : +a + +b;
};
var mult_or_div= function(sub, a, sign, b) {
 return sign=="*" ? a*b : a/b;
};
var power= function(sub, a, b) {
 return Math.pow(a, b);
};
var match_power= /(-?[\d\.]+)\s*\^\s*(-?[\d\.]+)/g;
var match_mult_div= /(-?[\d\.]+)\s*([\*\/])\s*(-?[\d\.]+)/g;
var match_sum_diff= /(-?[\d\.]+)\s*([\+-])\s*(-?[\d\.]+)/g;

var get_value= function(sub, exp) {
 while(exp.indexOf("^")!==-1)
  exp= exp.replace(match_power, power);
 while(match_mult_div.test(exp))
  exp= exp.replace(match_mult_div, mult_or_div);
 while(match_sum_diff.test(exp))
  exp= exp.replace(match_sum_diff, sum_or_diff);
 return exp;
};
while(str.indexOf("(") !== -1) // убираем скобки
 str=str.replace(/\(([^\(\)]*)\)/g, get_value);

return get_value("", str);

};
</script>
<input value="0.5 * 2 + 7 + -3*2"><input type="button" onclick="alert(calculate(this.previousSibling.value))" value="Посчитать">


Хотя, конечно, лучше через eval c проверкой, как-то так:
<input value="0.5 * 2 + 7 + -3*2"><input type="button" value="Посчитать" onclick="var str=this.previousSibling.value; if(str && !/[^\s\d\(\)\.\+\*\/-]/.test(str)) alert(eval(str)); else alert('Введите многочлен!')">


P. S. Ну и, естественно, нужны проверки на баланс скобок, например.

UPD: Допилил степень - "^", как в qBasic'е))
UPD-2: Подумал, вспомнил порядок выполнения мат. операторов, допилил ещё раз...
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)

Последний раз редактировалось trikadin, 19.11.2011 в 17:37.
Ответить с цитированием