Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript에서 문자열로 된 수학 표현식을 계산하는 방법

JavaScript에서는 문자열 형태로 주어진 수학 표현식을 실제로 계산해야 하는 경우가 종종 있습니다. 예를 들어 사용자 입력이나 외부 데이터에서 받아온 '1+23+4+5-30' 같은 문자열을 그대로 두면 단순한 텍스트일 뿐이지만, 이를 파싱하여 숫자 결과를 얻어야 할 때가 있습니다.

문제 정의

문자열로 된 수학식을 인수로 받아, 해당 식의 계산 결과를 반환하는 함수를 작성해 보겠습니다.

예를 들어 다음과 같은 문자열이 입력으로 주어졌다면 −

const str = '1+23+4+5-30';

출력값은 다음과 같아야 합니다.

3

접근 방법

핵심 아이디어는 정규표현식(RegExp)을 활용해 문자열에서 부호(+ 또는 −)와 숫자 조각들을 추출한 뒤, 각 조각을 순서대로 더하는 것입니다. 이 방식은 덧셈과 뺄셈으로만 이루어진 표현식을 안전하게 처리할 수 있으며, eval()처럼 임의의 코드를 실행하지 않으므로 보안상으로도 훨씬 안전합니다.

예제 코드

const str = '1+23+4+5-30';

const compute = (str = '') => {
    let total = 0;
    // 부호와 숫자 패턴을 배열로 추출
    str = str.match(/[+\-]*(\.\d+|\d+(\.\d+)?)/g) || [];
    while (str.length) {
        total += parseFloat(str.shift());
    }
    return total;
};

console.log(compute(str));

코드 설명

  • 정규표현식 매칭: /[+\-]*(\.\d+|\d+(\.\d+)?)/g 패턴은 앞에 붙은 부호(+ 또는 −)와 함께 소수 또는 정수를 하나의 그룹으로 묶어 추출합니다. 덕분에 -30은 음수 하나로, +23은 양수 하나로 인식됩니다.
  • 누적 합계: while 루프에서 shift()로 배열의 앞 요소를 하나씩 꺼내고, parseFloat()으로 문자열을 숫자로 변환한 뒤 total에 더합니다.
  • 안전장치: 매칭 결과가 없을 경우 || []로 빈 배열을 반환해 오류 없이 0을 반환하도록 처리했습니다.

출력 결과

콘솔에는 다음과 같이 출력됩니다.

3

주의 사항

이 방법은 덧셈과 뺄셈만 포함된 표현식에 적합합니다. 곱셈이나 나눗셈, 괄호가 포함된 복잡한 수식을 처리하려면 연산자 우선순위를 고려한 파서를 직접 구현하거나, 검증된 수식 파싱 라이브러리(math.js 등)를 사용하는 것이 좋습니다. 절대로 신뢰할 수 없는 입력에 eval()을 사용해서는 안 됩니다. 악성 코드 실행으로 이어질 수 있기 때문입니다.