Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.06.2016, 18:35
Интересующийся
Отправить личное сообщение для antonizbraniy Посмотреть профиль Найти все сообщения от antonizbraniy
 
Регистрация: 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 - инпут в который пишется результат
}
Ответить с цитированием
  #2 (permalink)  
Старый 12.06.2016, 19:12
Аватар для pureJS
Аспирант
Отправить личное сообщение для pureJS Посмотреть профиль Найти все сообщения от pureJS
 
Регистрация: 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
Ответить с цитированием
  #3 (permalink)  
Старый 12.06.2016, 19:15
Интересующийся
Отправить личное сообщение для antonizbraniy Посмотреть профиль Найти все сообщения от antonizbraniy
 
Регистрация: 12.05.2015
Сообщений: 16

Сообщение от Rise Посмотреть сообщение
alert(eval('Math.sqrt(4) + Math.pow(2,3)'))
Что тогда с моим инпутом не так ><
Изображения:
Тип файла: jpg Screenshot_1.jpg (17.1 Кб, 9 просмотров)
Ответить с цитированием
  #4 (permalink)  
Старый 12.06.2016, 19:21
Аватар для pureJS
Аспирант
Отправить личное сообщение для pureJS Посмотреть профиль Найти все сообщения от pureJS
 
Регистрация: 04.06.2016
Сообщений: 70

Сообщение от antonizbraniy Посмотреть сообщение
Что тогда с моим инпутом не так ><

antonizbraniy, моё сообщение посмотри - я там тебе написал что надо сделать, чтобы работало так, как ты хочешь.
Ответить с цитированием
  #5 (permalink)  
Старый 12.06.2016, 19:23
Интересующийся
Отправить личное сообщение для antonizbraniy Посмотреть профиль Найти все сообщения от antonizbraniy
 
Регистрация: 12.05.2015
Сообщений: 16

Сообщение от pureJS Посмотреть сообщение
antonizbraniy, моё сообщение посмотри - я там тебе написал что надо сделать, чтобы работало так, как ты хочешь.
Хорошо, спасибо. Просто я как раз отвечал на сообщение, когда ты написал)
Ответить с цитированием
  #6 (permalink)  
Старый 12.06.2016, 19:53
Интересующийся
Отправить личное сообщение для antonizbraniy Посмотреть профиль Найти все сообщения от antonizbraniy
 
Регистрация: 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? Может более простой? Просто я сейчас подумал над распознаванием и как то не очень хочется...делать для каждого. Это же ужас.
Ответить с цитированием
  #7 (permalink)  
Старый 12.06.2016, 20:14
Аватар для pureJS
Аспирант
Отправить личное сообщение для pureJS Посмотреть профиль Найти все сообщения от pureJS
 
Регистрация: 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.
Ответить с цитированием
  #8 (permalink)  
Старый 12.06.2016, 20:37
Интересующийся
Отправить личное сообщение для antonizbraniy Посмотреть профиль Найти все сообщения от antonizbraniy
 
Регистрация: 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))); Нечего не происходит (
Ответить с цитированием
  #9 (permalink)  
Старый 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, используя для нее набор переменных, чтобы прокинуть функции и переменные.
Ответить с цитированием
  #10 (permalink)  
Старый 12.06.2016, 20:53
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

Ну а при наличии операций вроде 5^2, увы, придется делать "по-честному" - парсить строку, строить дерево выражения, вычислять его...
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Арифметические действия на простом примере, обьясните почему c равно 2, а не 3? Игорь1000 Общие вопросы Javascript 5 06.03.2016 15:03
Находится ли мышка над дивом ? (выпадающее меню) advsm jQuery 31 24.09.2014 17:50
D'n'D над фреймами otkrick Общие вопросы Javascript 1 27.05.2013 20:12
Получить элемент относительно текущего, над которым произошло действие Киноман jQuery 2 30.04.2012 00:24
Арифметические действия Anastasiy17 Общие вопросы Javascript 11 14.04.2012 21:11