12.06.2016, 18:35
|
Интересующийся
|
|
Регистрация: 12.05.2015
Сообщений: 16
|
|
Арифметические действия над строкой
Здравствуйте. Помогите пожалуйста понять такую вещь. Я находил подобные темы и там всё решалось с помощью eval. Но как я заметил, он может выполнять только простые арифм. действия. А что нужно добавить, что бы он мог возводить в степень (и умеет ли он это)? Что то вроде 5^2 и т.д. Логарифм, корень и т.д. Может, что бы он понимал sqrt(x), Pow(x,n)?
Это сделано на клик по кнопке и умеет только +-*/:
var str=textos;
if (str && !/[^\s\d\(\)\.\+\*\/-]/.test(str))
{
$('#otvetka').val(eval(str));//otvetka - инпут в который пишется результат
}
|
|
12.06.2016, 19:12
|
|
Аспирант
|
|
Регистрация: 04.06.2016
Сообщений: 70
|
|
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
|
|
12.06.2016, 19:15
|
Интересующийся
|
|
Регистрация: 12.05.2015
Сообщений: 16
|
|
Сообщение от Rise
|
alert(eval('Math.sqrt(4) + Math.pow(2,3)'))
|
Что тогда с моим инпутом не так ><
|
|
12.06.2016, 19:21
|
|
Аспирант
|
|
Регистрация: 04.06.2016
Сообщений: 70
|
|
Сообщение от antonizbraniy
|
Что тогда с моим инпутом не так ><
|
antonizbraniy, моё сообщение посмотри - я там тебе написал что надо сделать, чтобы работало так, как ты хочешь.
|
|
12.06.2016, 19:23
|
Интересующийся
|
|
Регистрация: 12.05.2015
Сообщений: 16
|
|
Сообщение от pureJS
|
antonizbraniy, моё сообщение посмотри - я там тебе написал что надо сделать, чтобы работало так, как ты хочешь.
|
Хорошо, спасибо. Просто я как раз отвечал на сообщение, когда ты написал)
|
|
12.06.2016, 19:53
|
Интересующийся
|
|
Регистрация: 12.05.2015
Сообщений: 16
|
|
Сообщение от pureJS
|
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
|
Вы так сказали: "как ты хочешь". Есть другие варианты, как мне выполнять арифметические действия над строкой, без eval? Может более простой? Просто я сейчас подумал над распознаванием и как то не очень хочется...делать для каждого. Это же ужас.
|
|
12.06.2016, 20:14
|
|
Аспирант
|
|
Регистрация: 04.06.2016
Сообщений: 70
|
|
Сообщение от antonizbraniy
|
Вы так сказали: "как ты хочешь". Есть другие варианты, как мне выполнять арифметические действия над строкой, без eval? Может более простой? Просто я сейчас подумал над распознаванием и как то не очень хочется...делать для каждого. Это же ужас.
|
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 + выражение одной строкой.
Последний раз редактировалось pureJS, 12.06.2016 в 20:17.
|
|
12.06.2016, 20:37
|
Интересующийся
|
|
Регистрация: 12.05.2015
Сообщений: 16
|
|
Сообщение от pureJS
|
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))); Нечего не происходит (
|
|
12.06.2016, 20:50
|
Профессор
|
|
Регистрация: 12.04.2010
Сообщений: 557
|
|
если выражение укладывается в синтаксис javascript, то можно использовать with
with ({x: 1, y: 2}) {
with(Math) {
alert(eval('pow(y, x + 3) + sin(PI / 2)'));
}
}
здесь использованы переменные, функции из Math и константа PI оттуда же.
Однако eval считается плохой практикой (с чем я согласен), да и with вроде как тоже.
Потому всё это дело можно переписать через new Function, используя для нее набор переменных, чтобы прокинуть функции и переменные.
|
|
12.06.2016, 20:53
|
Профессор
|
|
Регистрация: 12.04.2010
Сообщений: 557
|
|
Ну а при наличии операций вроде 5^2, увы, придется делать "по-честному" - парсить строку, строить дерево выражения, вычислять его...
|
|
|
|