티스토리 뷰

반응형

 

PHP로 웹사이트를 개발하다 보면, 때때로 뜻밖의 경고 메시지가 화면에 출력되며 당황할 때가 있다. 그중에서도 Notice: A non well formed numeric value encountered라는 문구는 초보 개발자들에게 특히 낯설고 당황스러운 메시지 중 하나다.

이 오류는 코드가 실행되는 데 치명적인 에러는 아니지만, 처리하고 있는 데이터가 올바르지 않다는 신호다. 무시하고 지나가면 나중에 데이터 계산 오류나 결과 이상 등으로 이어질 수 있다. 실제로 PHP로 재료 원가 계산 로직을 구현하던 중 이 경고가 발생했고, 그 원인과 해결 방법을 정리해본다.

 

 

문제 상황

PHP 파일 /cost/list.php의 460번째 줄에서 아래와 같은 코드가 실행되고 있었다.

$saved_weight += ($temp_arr[0] * $temp_arr[1] * $temp_arr[2] * 7.93 * (int)$steelnum)/1000000 ;

화면에는 아래와 같은 경고 메시지가 출력되었다.

Notice: A non well formed numeric value encountered in /mirae8440/www/cost/list.php on line 460

이 줄의 코드는 철판의 길이, 폭, 두께를 곱하여 부피를 구하고, 여기에 철의 밀도 7.93과 수량을 곱한 후, 1,000,000으로 나누어 톤 단위 무게를 구하는 로직이다. 계산 자체는 문제 없어 보였지만, 실제 입력값에 따라 예상치 못한 경고가 발생하고 있었다.


원인 분석

이 경고는 대개 문자열을 숫자처럼 사용하려 할 때 발생한다. 예를 들어 '30mm', '40.5kg', '50T'처럼 단위가 포함된 문자열을 곧바로 수식에 넣으면, PHP는 이를 숫자로 해석하려 시도하면서 문제를 일으킨다.

PHP는 내부적으로 문자열을 숫자로 자동 형변환하려고 하지만, 완전히 숫자 형식이 아닌 경우에는 위와 같은 경고 메시지를 띄운다. 특히 float 형으로 예상되는 데이터에 문자(단위)가 섞여 있을 때 잘못된 연산으로 이어질 수 있다.

즉, $temp_arr[0], $temp_arr[1], $temp_arr[2] 중 하나 이상이 30mm, 40kg 같은 문자열이었던 것이다.


해결 방법

이 문제를 해결하기 위해서는 계산에 사용되는 모든 값이 정확한 숫자 값이 되도록 만들어야 한다. 단위가 포함된 문자열에서 숫자만 추출하는 방식으로 데이터 정제를 해주는 것이 핵심이다.

아래는 해당 코드를 수정한 예시다.

$val1 = (float) preg_replace('/[^0-9\.]/', '', $temp_arr[0]);
$val2 = (float) preg_replace('/[^0-9\.]/', '', $temp_arr[1]);
$val3 = (float) preg_replace('/[^0-9\.]/', '', $temp_arr[2]);

$saved_weight += ($val1 * $val2 * $val3 * 7.93 * (int)$steelnum) / 1000000;

여기서 사용된 preg_replace('/[^0-9\.]/', '', $temp_arr[0])는 정규식을 통해 숫자(0-9)와 소수점(.)을 제외한 모든 문자를 제거한다. 예를 들어 '30mm'는 '30'으로, '45.5kg'는 '45.5'로 변환된다. 그런 다음 (float) 형으로 형변환을 해주면 부동소수점 숫자로 안전하게 계산에 사용할 수 있다.

또한 (int)$steelnum도 숫자로 변환해서 곱셈에 사용하도록 처리해주는 것이 좋다. 데이터가 사용자의 입력이나 외부 데이터로부터 들어오는 경우, 항상 타입과 형식을 점검해주는 습관이 중요하다.


개발자 팁

개발을 하면서 이런 경고 메시지가 보일 때, 가장 먼저 입력된 데이터가 정확한 숫자인지 확인하는 것이 중요하다. 아래와 같이 로그를 출력해서 어떤 데이터가 들어오는지 확인할 수 있다.

error_log("temp_arr: " . print_r($temp_arr, true));
error_log("steelnum: " . $steelnum);

또한, 숫자 단위가 포함된 데이터를 처리할 때는 가능하면 데이터 정제 과정을 별도의 함수로 만들어두면 재사용성도 높고 유지보수도 쉬워진다.


정리하자면

  • "A non well formed numeric value encountered" 경고는 숫자처럼 보이지만 실제로는 문자가 섞인 값이 계산에 사용될 때 발생한다.
  • preg_replace로 숫자만 추출하고 float 혹은 int로 캐스팅하여 문제를 해결할 수 있다.
  • 외부 입력 데이터는 항상 정제 과정을 거쳐야 안정적인 코드가 된다.
  • 경고를 무시하지 말고, 발생 원인을 파악하여 수정하는 습관이 중요하다.

실제 프로젝트에서 발생한 문제를 통해 데이터의 정확성과 정제의 중요성을 다시 한번 느끼게 된다. PHP는 너그러운 언어이지만, 그만큼 데이터 처리에 더 주의를 기울여야 한다. 이런 사소한 경고들이 때로는 전체 시스템의 정확도와 신뢰성을 좌우할 수 있다는 점을 잊지 말자.

 

반응형
댓글