티스토리 뷰
PHP 경고 메시지 "A non well formed numeric value encountered" 해결 방법
Coding Life 2025. 3. 25. 08:52
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는 너그러운 언어이지만, 그만큼 데이터 처리에 더 주의를 기울여야 한다. 이런 사소한 경고들이 때로는 전체 시스템의 정확도와 신뢰성을 좌우할 수 있다는 점을 잊지 말자.
'IT tech Coding > php' 카테고리의 다른 글
PHP에서 JSON 데이터를 활용해 각 항목의 상태를 자동으로 판정하는 방법 (0) | 2025.03.23 |
---|---|
수입검사 품목에 대한 통계자료 작성 코드 (0) | 2025.03.13 |
json형태로 가이드레일 형태의 정보 및 이미지 저장하는 로직개발 (0) | 2025.03.10 |
PHP에서 특정 단어가 포함되었는지 확인하는 방법 (0) | 2025.03.04 |
계층형 카테고리 관리: MySQL과 PHP로 트리 구조 만들기 (0) | 2025.02.26 |
- Total
- Today
- Yesterday
- json파일형태보기
- #데이터베이스설계
- 티스토리챌린지
- 효율적코딩방법
- #데이터무결성
- 캐드자동작도
- 웹제작강의안2주차
- 엑셀보호
- Bootstrap 5
- #php에러해결 #php경고메시지 #nonwellformednumeric #php초보자팁 #웹개발에러 #프로그래밍디버깅 #php정규식 #코드디버깅팁 #웹개발문제해결 #php숫자형변환
- #동적ui
- #tuigrid #자바스크립트그리드 #행삽입 #행삭제 #웹개발팁 #프론트엔드개발 #javascriptgrid #데이터테이블 #ui개선 #그리드커스터마이징
- #트리구조
- 코딩튜토리얼
- #웹개발
- General error: 2031
- 엑셀입력보호
- 엑셀셀보호
- 구글드라이브API
- ajax오류메시지
- 오토핫키가이드
- 오블완
- 도면자동생성
- coalesce는 한국어로 "코얼레스크" 또는 "코얼리스"
- #계층형데이터
- #textarea #자동높이조절 #ux개선 #웹개발 #프론트엔드 #자바스크립트 #html팁 #웹디자인 #uiux #코딩팁
- isset을 적용해야 하는 이유
- json파일편하게보는법
- #카테고리트리
- 1. #웹개발 2. #로트번호 3. #성적서보기 4. #ajax 5. #jquery 6. #php 7. #프론트엔드 8. #백엔드 9. #부트스트랩 10. #웹기능구현
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |