숫자 값을 생성하기 위해 '1+1'
호출하지 않고 문자열 (예 :)에서 수학 표현식을 구문 분석하고 평가하는 방법은 eval(string)
무엇입니까?
이 예제에서는 함수가을 받아들이고 '1+1'
반환 하기를 원합니다 2
.
답변
다음 과 같은 작업을 수행 할 수있는 JavaScript Expression Evaluator 라이브러리 를 사용할 수 있습니다.
Parser.evaluate("2 ^ x", { x: 3 });
math.eval('sin(45 deg) ^ 2');
결국 내 프로젝트 중 하나에 mathjs를 선택했습니다.
답변
+ 또는-를 쉽게 수행 할 수 있습니다.
function addbits(s) {
var total = 0,
s = s.match(/[+\-]*(\.\d+|\d+(\.\d+)?)/g) || [];
while (s.length) {
total += parseFloat(s.shift());
}
return total;
}
var string = '1+23+4+5-30';
console.log(
addbits(string)
)
더 복잡한 수학은 eval을 더 매력적으로 만들고 확실히 쓰기를 더 간단하게 만듭니다.
답변
누군가 그 문자열을 파싱해야합니다. 인터프리터가 아니라면 (을 통해 eval
) 숫자, 연산자 및 수학 표현식에서 지원하려는 다른 모든 것을 추출하는 구문 분석 루틴을 작성하는 것이 당신이어야합니다.
따라서 .NET 없이는 (간단한) 방법이 없습니다 eval
. 보안에 대해 우려하는 경우 (파싱하는 입력이 제어하는 소스가 아니기 때문에) eval
?에 전달하기 전에 입력의 형식 (화이트리스트 정규식 필터를 통해)을 확인할 수 있습니다 .
답변
더 짧은 정규 표현식을 사용하고 연산자 사이에 공백을 허용하는 @kennebec의 우수한 답변에 대한 대안
function addbits(s) {
var total = 0;
s = s.replace(/\s/g, '').match(/[+\-]?([0-9\.\s]+)/g) || [];
while(s.length) total += parseFloat(s.shift());
return total;
}
그것을 사용하십시오
addbits('5 + 30 - 25.1 + 11');
최신 정보
더 최적화 된 버전이 있습니다.
function addbits(s) {
return (s.replace(/\s/g, '').match(/[+\-]?([0-9\.]+)/g) || [])
.reduce(function(sum, value) {
return parseFloat(sum) + parseFloat(value);
});
}
답변
같은 목적으로 BigEval 을 만들었습니다 .
식을 풀 때 Eval()
%, ^, &, ** (승수) 및! (계승). 표현식 내에서 함수와 상수 (또는 변수)를 사용할 수도 있습니다. 표현식은 JavaScript를 포함한 프로그래밍 언어에서 일반적으로 사용되는 PEMDAS 순서 로 해결됩니다 .
var Obj = new BigEval();
var result = Obj.exec("5! + 6.6e3 * (PI + E)"); // 38795.17158152233
var result2 = Obj.exec("sin(45 * deg)**2 + cos(pi / 4)**2"); // 1
var result3 = Obj.exec("0 & -7 ^ -7 - 0%1 + 6%2"); //-7
임의의 정밀도로 숫자를 처리하는 경우 산술에 해당 Big Number 라이브러리를 사용하도록 만들 수도 있습니다.
답변
수학적 표현을 평가하기 위해 JavaScript 라이브러리를 찾고 있었고 다음 두 가지 유망한 후보를 찾았습니다.
-
JavaScript Expression Evaluator : 더 작고 가볍습니다. 대수식, 대체 및 여러 함수를 허용합니다.
-
mathjs : 복소수, 행렬 및 단위도 허용합니다. 브라우저 내 JavaScript 및 Node.js 모두에서 사용하도록 제작되었습니다.
답변
저는 최근 Eval()
에 Reverse Polish Notation 의 표현을 평가하여 C #에서이 작업을 수행했습니다 ( 우리에게는 아닙니다 … ). 어려운 부분은 실제로 문자열을 구문 분석하여 Reverse Polish Notation으로 바꾸는 것입니다. Wikipedia 및 의사 코드에 대한 훌륭한 예가 있으므로 Shunting Yard 알고리즘을 사용했습니다 . 둘 다 구현하는 것이 정말 간단하다는 것을 알았고 아직 해결책을 찾지 못했거나 대안을 찾고 있다면 이것을 권장합니다.