Арифметические действия над строкой
Здравствуйте. Помогите пожалуйста понять такую вещь. Я находил подобные темы и там всё решалось с помощью eval. Но как я заметил, он может выполнять только простые арифм. действия. А что нужно добавить, что бы он мог возводить в степень (и умеет ли он это)? Что то вроде 5^2 и т.д. Логарифм, корень и т.д. Может, что бы он понимал sqrt(x), Pow(x,n)?
Это сделано на клик по кнопке и умеет только +-*/: var str=textos; if (str && !/[^\s\d\(\)\.\+\*\/-]/.test(str)) { $('#otvetka').val(eval(str));//otvetka - инпут в который пишется результат } |
antonizbraniy, так, как ты хочешь (через eval) можно сделать, если для возведения числа в степень записать так:
eval('Math.pow(' + base+ ', ' + exponent + ')'); Естественно, что тебе надо будет заранее распознавать, к примеру 5^2, разделять их и только потом отправлять в eval. По-другому нельзя! Math.pow() - возводит число в степень Math.pow(base, exponent) http://javascript.ru/Math-pow Также доступны: Math.acos Math.asin Math.atan Math.atan2 Math.exp Math.min Math.random Math.sqrt Math.log Math.round Math.floor Math.ceil Math.sin Math.cos Math.tan Math.pow Math.max Math.abs Подробнее тут: http://javascript.ru/math |
Вложений: 1
Цитата:
|
Цитата:
antonizbraniy, моё сообщение посмотри - я там тебе написал что надо сделать, чтобы работало так, как ты хочешь. |
Цитата:
|
Цитата:
|
Цитата:
antonizbraniy, мне сложно сказать, но судя по поставленной тобой задаче, только так. Ещё можно, к примеру, не всё выражение из строки брать как у тебя в задаче, а к примеру, число возводимое в степень брать из "input type=text" (1), а его степень из "input type=text" (2) и их проставлять в моё выражение: eval('Math.pow(' + base+ ', ' + exponent + ')'); где base - это число из "input type=text" (1) а exponent - это число из "input type=text" (2) Можно это всё и без eval записать вот так: var base = document.getElementById('input_1'); var exponent = document.getElementById('input_2'); var число_в_степени = Math.pow(parseInt(base), parseInt(exponent)); Возможно, что ты это всё так и хотел, но в описании задачи у тебя написано по-другому - обязательно через eval + выражение одной строкой. |
Цитата:
function convertToMath(string){ var str = string; str = str.replace(/(sin|cos|tan|asin|acos|atan|pow|abs|exp|sqrt)\(/g, "Math.$&"); str = str.replace(/(ln)\(/g, "Math.log("); str = str.replace(/(cotan)\(/g, "1/Math.tan("); str = str.replace(/(acotan)\(/g, "Math.PI/2-Math.atan("); str = str.replace(/(log)\(/g, "repl.$&"); str = str.replace(/(dtor)\(/g, "degToRad("); logCount = (str.match(/repl\.log\(/g) || []).length; for (var i = 1; i <= logCount; i++) { console.log('str - do ' + str); str = findLogArgs(str); console.log('str - posle ' + str); }; return str; } Как я понимаю, если она находит такие вещи в строке как pow, sin и т.д. Она заменяет на Math.pow и т.д. Ведь это мне и нужно? Я попытался изменить строку вывода: $('#otvetka').val(eval(convertToMath(textos))); Нечего не происходит ( |
если выражение укладывается в синтаксис javascript, то можно использовать with
with ({x: 1, y: 2}) { with(Math) { alert(eval('pow(y, x + 3) + sin(PI / 2)')); } } здесь использованы переменные, функции из Math и константа PI оттуда же. Однако eval считается плохой практикой (с чем я согласен), да и with вроде как тоже. Потому всё это дело можно переписать через new Function, используя для нее набор переменных, чтобы прокинуть функции и переменные. |
Ну а при наличии операций вроде 5^2, увы, придется делать "по-честному" - парсить строку, строить дерево выражения, вычислять его...
|
Часовой пояс GMT +3, время: 21:10. |