숫자 문자열

숫자 문자열 (Numeric strings)

이 페이지는 PHP 문자열이 언제 숫자(numeric)로 간주되는지 정의하고, 숫자 문맥에서 문자열이 평가되는 규칙과 PHP 8.0.0 이전의 동작 차이를 설명합니다.

출처: PHP: Numeric strings - Manual

본문

PHP 문자열은 int나 float로 해석될 수 있다면 숫자(numeric)로 간주합니다.

정식으로는 PHP 8.0.0 기준:

WHITESPACES      \s*
LNUM             [0-9]+
DNUM             ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM    (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
INT_NUM_STRING   {WHITESPACES} [+-]? {LNUM} {WHITESPACES}
FLOAT_NUM_STRING {WHITESPACES} [+-]? ({DNUM} | {EXPONENT_DNUM}) {WHITESPACES}
NUM_STRING       ({INT_NUM_STRING} | {FLOAT_NUM_STRING})

PHP에는 또 선행 숫자 문자열(leading numeric strings)이라는 개념이 있습니다. 이것은 단순히 숫자 문자열처럼 시작하고 그 뒤에 어떤 문자가든 따라오는 문자열입니다.

참고: 숫자로 둘러싸인 문자 E (대소문자 구분 없음)를 포함하는 어떤 문자열이든 과학적 표기법(scientific notation)으로 표현된 숫자로 간주됩니다. 이로 인해 예상치 못한 결과가 나올 수 있습니다.

예제 #1 과학적 표기법 비교 (Scientific Notation Comparisons)

<?php
var_dump("0D1" == "000"); // false, "0D1" is not scientific notation
var_dump("0E1" == "000"); // true, "0E1" is 0 * (10 ^ 1), or 0
var_dump("2E1" == "020"); // true, "2E1" is 2 * (10 ^ 1), or 20
?>

숫자 문맥에서 사용되는 문자열 (Strings used in numeric contexts)

문자열을 숫자로 평가해야 할 때(예: 산술 연산, int 타입 선언 등) 결과를 결정하기 위해 다음 단계를 거칩니다.

  • 문자열이 숫자라면, 문자열이 정수 숫자 문자열이고 int 타입의 한계(PHP_INT_MAX 로 정의됨) 안에 들어맞으면 int로, 그렇지 않으면 float로 해석합니다.
  • 문맥이 선행 숫자 문자열을 허용하고 문자열이 그것이라면, 문자열의 선행 부분이 정수 숫자 문자열이고 int 타입의 한계 안에 들어맞으면 int로, 그렇지 않으면 float로 해석합니다. 추가로 E_WARNING 수준의 오류가 발생합니다.
  • 문자열이 숫자가 아니라면 TypeError 를 던집니다.

PHP 8.0.0 이전의 동작 (Behavior prior to PHP 8.0.0)

PHP 8.0.0 이전에는, 문자열이 선행 공백(leading whitespaces)만 가졌다면 숫자로 간주했습니다. 뒤따르는 공백(trailing whitespaces)이 있으면 문자열은 선행 숫자(leading numeric)로 간주되었습니다.

PHP 8.0.0 이전에는 문자열이 숫자 문맥에서 사용될 때 다음 차이점을 제외하고 위와 같은 단계를 수행했습니다:

  • 선행 숫자 문자열의 사용은 E_WARNING 대신 E_NOTICE 를 발생시켰습니다.
  • 문자열이 숫자가 아니라면 E_WARNING 이 발생하고 값 0 이 반환되었습니다.

PHP 7.1.0 이전에는 E_NOTICEE_WARNING 도 발생하지 않았습니다.

<?php
$foo = 1 + "10.5";                // $foo is float (11.5)
$foo = 1 + "-1.3e3";              // $foo is float (-1299)
$foo = 1 + "bob-1.3e3";           // TypeError as of PHP 8.0.0, $foo is integer (1) previously
$foo = 1 + "bob3";                // TypeError as of PHP 8.0.0, $foo is integer (1) previously
$foo = 1 + "10 Small Pigs";       // $foo is integer (11) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously
$foo = "10.0 pigs " + 1;          // $foo is float (11) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously
$foo = "10.0 pigs " + 1.0;        // $foo is float (11) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously
?>

더 알아보기