Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Арифметические действия над строкой (https://javascript.ru/forum/misc/63517-arifmeticheskie-dejjstviya-nad-strokojj.html)

antonizbraniy 12.06.2016 18:35

Арифметические действия над строкой
 
Здравствуйте. Помогите пожалуйста понять такую вещь. Я находил подобные темы и там всё решалось с помощью eval. Но как я заметил, он может выполнять только простые арифм. действия. А что нужно добавить, что бы он мог возводить в степень (и умеет ли он это)? Что то вроде 5^2 и т.д. Логарифм, корень и т.д. Может, что бы он понимал sqrt(x), Pow(x,n)?

Это сделано на клик по кнопке и умеет только +-*/:

var str=textos;
if (str && !/[^\s\d\(\)\.\+\*\/-]/.test(str))
{
$('#otvetka').val(eval(str));//otvetka - инпут в который пишется результат
}

Rise 12.06.2016 18:54

Цитата:

Сообщение от antonizbraniy (Сообщение 419177)
Но как я заметил, он может выполнять только простые арифм. действия.

alert(eval('Math.sqrt(4) + Math.pow(2,3)'))

pureJS 12.06.2016 19:12

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

antonizbraniy 12.06.2016 19:15

Вложений: 1
Цитата:

Сообщение от Rise (Сообщение 419179)
alert(eval('Math.sqrt(4) + Math.pow(2,3)'))

Что тогда с моим инпутом не так ><

pureJS 12.06.2016 19:21

Цитата:

Сообщение от antonizbraniy (Сообщение 419181)
Что тогда с моим инпутом не так ><


antonizbraniy, моё сообщение посмотри - я там тебе написал что надо сделать, чтобы работало так, как ты хочешь.

Rise 12.06.2016 19:22

antonizbraniy, регулярку не проходит

antonizbraniy 12.06.2016 19:23

Цитата:

Сообщение от pureJS (Сообщение 419183)
antonizbraniy, моё сообщение посмотри - я там тебе написал что надо сделать, чтобы работало так, как ты хочешь.

Хорошо, спасибо. Просто я как раз отвечал на сообщение, когда ты написал)

antonizbraniy 12.06.2016 19:53

Цитата:

Сообщение от pureJS (Сообщение 419180)
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? Может более простой? Просто я сейчас подумал над распознаванием и как то не очень хочется...делать для каждого. Это же ужас.

pureJS 12.06.2016 20:14

Цитата:

Сообщение от antonizbraniy (Сообщение 419189)
Вы так сказали: "как ты хочешь". Есть другие варианты, как мне выполнять арифметические действия над строкой, без 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 + выражение одной строкой.

antonizbraniy 12.06.2016 20:37

Цитата:

Сообщение от pureJS (Сообщение 419194)
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))); Нечего не происходит (


Часовой пояс GMT +3, время: 02:18.