PHP에서 문자열을 숫자로 어떻게 변환합니까?


670

나는 값, 이러한 유형의 변환 할 '3', '2.34', '0.234343'숫자로 등. JavaScript에서는을 사용할 수 Number()있지만 PHP에서 사용할 수있는 비슷한 방법이 있습니까?

Input             Output
'2'               2
'2.34'            2.34
'0.3454545'       0.3454545

63
독자 :이 질문에 대한 실제 답변은 없습니다 :(
Matthieu Napoli

@MatthieuNapoli 대답은 일반적으로 Php가 동적 유형 시스템의 특권 중 하나 인 당신을 위해 그것을 알아내는 것입니다.
Kolob Canyon

12
모든 불확실성의 사슬과 '보통'.
person27

2
@MatthieuNapoli 타입 캐스팅은 어떻게 "실제 답변"이 아닌가? 아기가되고 싶다면 캐스트를 한 후에도 유형을 확인할 수 있습니다.
Kolob Canyon

3
@MatthieuNapoli 나는 당신이 고양이를 껍질을 벗기는 방법이 하나 이상이라는 것을 의미한다는 것을 분명히 밝힌다. 예를 들어, 데이터베이스 작업에서 캐스팅은 매우 중요합니다. 예를 들어 매개 변수가있는 PDO 쿼리에서 파서는 문자열이 아니라 숫자임을 인식하기가 어려울 수 있습니다. 그런 다음 문자열을 int로 캐스팅하지 않았기 때문에 정수 필드에서 0으로 끝납니다. 매개 변수 단계에서.
stubsthewizard

답변:


1031

PHP는 대부분의 상황에서 유형을 강제하기 때문에 일반적으로이 작업을 수행 할 필요는 없습니다. 명시 적으로 유형을 변환하려는 경우 유형을 캐스트 하십시오.

$num = "3.14";
$int = (int)$num;
$float = (float)$num;

4
여기 상황이 조금 다릅니다. 문자열 (숫자 만 포함)을 일반 숫자로 변환하고 싶습니다. U는 자바 스크립트에서 알 수 있듯이 parseInt () 를 사용 하여 string => int를 변환하거나 parseFloat ()를 사용하여 string => float를 변환 할 수 있습니다. 그러나 일반적으로 javaScript는 Number ()를 사용하여 문자열 => 숫자를 변환합니다. PHP에서 비슷한 방법을 원하십니까?
Sara

4
전체 날짜 문자열에서 얻은 월 번호가있을 때 나에게 유용했습니다. 여기 나방 이름 배열에서 값을 가져 오는 데 사용했습니다. 문자열 인덱스는 유효하지만 동등하지 않기 때문에 자동 전송이 발생하지 않습니다.
Cazuma Nii Cavalcanti

19
상황에 따라 .소수점 구분 기호 로 가정하는 것이 안전하지 않을 수 있습니다 . en.wikipedia.org/wiki/…
Dave Jarvis

3
@Sara : 먼저 문자열 을 정수로 캐스트 한 다음 플로팅 한 다음 두 값 (정수 및 플로트)이 동일한 지 비교 하여 문자열을 숫자 로 변환하는 함수를 작성할 수도 있습니다 . 만약 그렇다면, 값을 정수로, 그렇지 않으면 정수로 리턴해야합니다. 아이디어를 얻길 바랍니다.
Youstay Igo

2
정수를 파일 시스템으로 전달해야하는 경우가 있습니다. PHP가 변환을 수행 할 때까지 기다리는 것은 좋지 않습니다.
AaA

173

그렇게하는 몇 가지 방법이 있습니다.

  1. 문자열을 숫자 기본 데이터 유형으로 캐스트하십시오.

    $num = (int) "10";
    $num = (double) "10.12"; // same as (float) "10.12";
  2. 문자열에서 수학 연산을 수행하십시오.

    $num = "10" + 1;
    $num = floor("10.1");
  3. 사용 intval()또는 floatval():

    $num = intval("10");
    $num = floatval("10.1");
  4. 사용하십시오 settype().


9
참고 (double)단지의 별칭입니다 (float).
deceze

4
@ downvoter, 나는 내 대답에 어떤 문제가 있는지 모른다. OP가 질문을 편집하기 전에 이것을 게시했지만 편집 된 질문도 포함합니다 ( $num = "10" + 1예).
fardjad

2
@ ed-ta : 문자열을 전달하면 0 대신 최소 / 최대 값을 반환합니다. 즉 intval("9999999999")==2147483647.
riv

6
intvalarray_map('intval', $arrayOfStrings);캐스팅으로는 할 수없는 것을 사용할 수 있기 때문에 유용합니다 .
icc97

2
대신 $num = "10" + 1;그것을 사용하는 것이 좋습니다 $num = "10" * 1;값 (곱셈의 중립 요소) 변경되지 않습니다 때문에,이 같은 본질적으로 toNumber(..)최종 유형이 문자열을 변환하는 데 필요한 무엇에 의해 결정되기 때문에이 "10"-> (INT) 10; "10.1"-> (플로트) 10.1;
홀리

57

문제를 피하기 위해 시도하십시오 intval($var). 몇 가지 예 :

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34 (octal as starts with zero)
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26 (hex as starts with 0x)
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
?>

4
IMHO, 숫자 문자열의 기수를 고려한 유일한 답이므로 유일하게 정답입니다. 숫자 형 문자열에 하나 이상의 선행 0이 있으면 문자열이 단순히 형변환을 사용하는 모든 응답 (사용자 정의 함수를 제안하는 것까지도)이 실패하며 문자열은 8 진 기준이있는 숫자로 의도되지 않습니다.
구문 Junkie

"12.7896"을로 변환하려는 경우 어떤 아이디어가 12.7896있습니까?
Agnes Palit

floatval ()을 사용하여 문자열을 부동 소수점으로 변환하십시오. floatval ( "12.7896")은 12.7896을 반환합니다
gopeca

이것이 왜 대답이 맞지 않습니까? PHP는 외부인으로서 나는 이미 알고 (int)$my_str내가 처리 된 이후 것없는 일을 구체적으로 문자열 liks로 01하고 013내가베이스 10로 해석 할 것인지 ... 그래서 명시 적 기반을 제공 할 수있는 방법을 원했다.
Giacomo Alzetta

48

(느슨하게 타이핑 된) 언어에서 0을 추가하여 항상 문자열을 숫자로 변환 할 수 있습니다.

그러나 PHP는이 변수를 사용할 때 자동으로 수행하므로 출력시 문자열로 캐스팅되기 때문에 의미가 거의 없습니다.

부동으로 캐스팅 한 후 부동 숫자의 특성으로 인해 예기치 않게 변경 될 수 있기 때문에 점으로 구분 된 숫자를 문자열로 유지하려고 할 수 있습니다.


35
0을 추가하여 문자열을 숫자로 캐스트 할 수없는 많은 언어가 있지만 일반적으로 유효한 캐스팅 방법이 아닌 오류로 간주됩니다. :).
Jan Špaček

4
honzasp 자바 스크립트에서, 예를 들어, 권리 typeof('123'+0)부여 'string'하기 때문에, '123'+0제공합니다 '1230'.
Oriol

5
PHP에서는 대부분 === 스타일 비교를 사용하는 것이 좋습니다. 따라서 데이터를 비교할 경우 어떤 유형의 데이터가 저장되어 있는지가 매우 중요합니다.
Jonathon

0을 추가하면 진정한 의미에서 '캐스팅'되지 않으며 기본적으로 변환됩니다.
CSᵠ

12
자바 스크립트에서 @oriol 당신은 0+'123'얻을 0 을 숫자를 추가해야합니다123
Timo Huovinen

24

당신이 사용할 수있는:

(int)(your value);

또는 다음을 사용할 수 있습니다.

intval(string)

입력 한 숫자가 '2.3456'인 경우 어떻게 2.3456을 얻습니까?
Sara

6
문제는 또한 수레에 관한 것입니다.
taseenb

플로트라고 표시된 OP의 한 줄을 보여주세요. 패스 의견과 다운 투표 전에 Original Post를보십시오.
noobie-php

2
이 예는 float를 보여줍니다. 숫자 문자열을 숫자 값 (floats 및 integers)으로 변환하는 방법을 묻습니다.
taseenb

먼저 숫자가로 부동 소수점 is_float인지 확인하고 통과하면 (float)대신 로 캐스트합니다 (int).
Martin van Driel

24

에 대한 부동 소수점을 원 $value = '0.4'하지만 int에 대해서는 다음 $value = '4'과 같이 쓸 수 있습니다.

$number = ($value == (int) $value) ? (int) $value : (float) $value;

조금 더럽지 만 작동합니다.


3
아마 더러워? strpos($val, '.') === false ? intval($val) : floatval($val);
jchook

4
@jchook 로케일에 따라 다르기 때문에 더러울 수 있습니다 (예 : '0.4'대신 '0,4').
Nick Rice

좋은 지적. 나는 당신이 localeconv()['decimal_point']대신 사용할 수 있다고 생각합니다 '.'. 이 strpos솔루션 의 한 가지 장점은 두 배 캐스팅보다 거의 2 배 빠르다는 것입니다.
jchook

2
@jchook과 같은 경우에 깨지는 2.1e2소수점이 있지만 결과 숫자는 정수입니다.
Tomáš Blatný

1
+ID 연산자를 사용하십시오 : var_dump(+'0.4', +'4'), float 및 int를 제공합니다. php.net/manual/en/language.operators.arithmetic.php
tvanc

15

당신은 항상 그것에 0을 추가 할 수 있습니다!

Input             Output
'2' + 0           2 (int)
'2.34' + 0        2.34 (float)
'0.3454545' + 0   0.3454545 (float)

이 오류가 발생했습니다 A non well formed numeric value encountered. 어떤 생각?
Agnes Palit

15

대신 변환할지 여부를 선택할 필요없이 stringint또는 float, 당신은 단순히를 추가 할 수 있습니다 0여기에, 그리고 PHP는 자동으로 숫자 타입으로 결과를 변환합니다.

// Being sure the string is actually a number
if (is_numeric($string))
    $number = $string + 0;
else // Let the number be 0 if the string is not a number
    $number = 0;

13

PHP 에서는 intval(string) or floatval(string)함수를 사용 하여 문자열을 숫자로 변환 할 수 있습니다 .


4
아니요 일반적인 방법을 원합니다. 즉, '5'=> 5 인 경우 5로 변환해야하고 '2.345'=> 인 경우 2.345로 변환해야합니다.
Sara

13

그렇습니다. PHP에는 비슷한 방법이 있지만 거의 알지 못합니다. 여기에 설명 된대로 " identity " 라는 산술 연산자입니다 .

산술 연산자

숫자 문자열을 숫자로 변환하려면 다음과 같이하십시오.

$a = +$a;

경고 : 해킹이 감지되었습니다.
그렉

안녕하세요 @Greg. 여기에 게시 된 링크를 클릭 했습니까? 이것이 개발자가이 연산자에 대해 말한 것입니다. $ a를 int 또는 float로 적절히 변환합니다. 여기서 "변환"은 숫자-숫자 변환으로 이해 될 수 없습니다. 왜? 배타적 인 산술 관점에서이 연산자는 절대 쓸모가 없습니다! 숫자에 "+1"(식별 기능과 동일)을 곱해도 아무런 영향을 미치지 않습니다. 따라서 여기에 제안 된 유형 변환 이외 의이 연산자에 대한 다른 유틸리티는 상상할 수 없습니다.
aldemarcalazans

@Greg-이것은 대부분의 다른 답변보다 해킹 이 적습니다 . 내장 된 연산자로 요청 된 것을 정확하게 수행합니다. (처음 확인하는 것이 가장 is_numeric
좋지만

캐스팅에 산술 연산자를 사용하면 완벽하게 작동하지만 실제로 놓치기 쉽습니다. 경고 할 가치가 있다고 생각합니다.
Greg Greg

11

어떤 경우에는 유용하고 더 안전 할 수있는 답변에 대한 약간의 메모입니다. 문자열에 실제로 유효한 숫자 값이 포함되어 있는지 확인한 다음 숫자 형식으로 변환해야합니다 (예 : ints를 문자열로 변환하는 db에서 가져온 데이터를 조작해야하는 경우). is_numeric()다음을 사용할 수 있습니다 floatval().

$a = "whatever"; // any variable

if (is_numeric($a)) 
    var_dump(floatval($a)); // type is float
else 
    var_dump($a); // any type

9

원하는 것을 달성하는 기능은 다음과 같습니다. 먼저 값을 숫자로 이해할 수 있는지 확인하여 값을 int와 float로 바꿉니다. int와 float가 동일하면 (예 : 5 == 5.0) int 값을 반환합니다. int와 float가 동일하지 않으면 (예 : 5! = 5.3) float의 정밀도가 필요하다고 가정하고 해당 값을 반환합니다. 값이 숫자가 아닌 경우 경고를 발생시키고 null을 반환합니다.

function toNumber($val) {
    if (is_numeric($val)) {
        $int = (int)$val;
        $float = (float)$val;

        $val = ($int == $float) ? $int : $float;
        return $val;
    } else {
        trigger_error("Cannot cast $val to a number", E_USER_WARNING);
        return null;
    }
}

6

JavaScript에서 문자열을 숫자로 변환하는 간단한 방법은 문자열에 1을 곱하는 것입니다. "+"기호는 JavaScript에서 여러 용도를 사용하고 "*"기호는 순전히 연결 문제를 해결합니다. 수학적 곱셈.

PHP에서 숫자가 포함 된 문자열을 숫자로 자동으로 기꺼이 해석하려는 PHP와 관련하여 여기에서 본 내용 (및 PHP에서 "+"는 수학적으로 추가하기 때문에 추가에 대한 주석)을 바탕 으로이 곱하기 트릭은 잘 작동합니다. PHP도 마찬가지입니다.

나는 그것을 테스트했으며 작동합니다 ... 문자열을 어떻게 획득했는지에 따라 1을 곱하기 전에 trim () 함수를 적용 할 수 있습니다.


6

다음은 스스로 단순화하기 위해 작성한 함수입니다.

또한 부울, 정수, 이중 및 실수의 속기 버전을 반환합니다.

function type($mixed, $parseNumeric = false)
{        
    if ($parseNumeric && is_numeric($mixed)) {
        //Set type to relevant numeric format
        $mixed += 0;
    }
    $t = gettype($mixed);
    switch($t) {
        case 'boolean': return 'bool'; //shorthand
        case 'integer': return 'int';  //shorthand
        case 'double': case 'real': return 'float'; //equivalent for all intents and purposes
        default: return $t;
    }
}

parseNumeric이 true로 설정된 type을 호출하면 type을 확인하기 전에 숫자 문자열이 변환됩니다.

그러므로:

type ( "5", true)은 int를 반환합니다

type ( "3.7", true)은 float를 반환합니다

type ( "500")은 문자열을 반환합니다

이것은 일종의 잘못된 검사 방법이므로 실제 변수는 여전히 문자열입니다. 필요한 경우 실제 변수를 올바른 유형으로 변환해야합니다. 데이터베이스가 항목 ID 또는 별칭을로드 해야하는지 확인하기 위해 방금 런타임에 문자열로 구문 분석되므로 예기치 않은 영향을 미치지 않습니다.

편집하다

객체가 함수인지 감지하려면이 경우를 스위치에 추가하십시오.

case 'object': return is_callable($mixed)?'function':'object';

6

Boykodev의 답변 외에도 다음과 같이 제안합니다.

Input             Output
'2' * 1           2 (int)
'2.34' * 1        2.34 (float)
'0.3454545' * 1   0.3454545 (float)

이것에 대해 조금 생각하고 나면 1로 나누기를 제안 할 수도 있습니다 :)
Boykodev

1
그게 요점입니다! :) 그런데 솔루션이 위의 모든 과학적 표기법 보다 훨씬 낫습니다 . 감사합니다.
drugan

이 솔루션은 내 문제를 해결했습니다. 필자의 경우 $id_cron = (string)date('YmdHi'); $target_id_cron = $id_cron - 1;$ target_id_cron = (int) $ id_cron-1;
inMILD

1
A non well formed numeric value encounteredstring을 float로 변경하려고 할 때이 오류가 발생했습니다 $num = '12,24' * 1. 어떠한 제안?
Agnes Palit

5
$a = "10";

$b = (int)$a;

이것을 사용하여 PHP 에서 문자열을 int로 변환 할 수 있습니다 .


2
입력 한 숫자가 '7.2345'이면 사용할 수 없으며 (int) 사용할 수 있습니다 (float). 내가 필요한 것은 일반적인 솔루션입니다.
Sara

1
항상 double 또는 float을 사용할 수 있습니다.
Pritom

5

간단히 다음과 같이 쓸 수 있습니다.

<?php
    $data = ["1","2","3","4","5"];
    echo json_encode($data, JSON_NUMERIC_CHECK);
?>

3
이 코드는 질문에 대답 할 수 있지만,이 코드가 질문에 응답하는 이유 및 / 또는 방법에 대한 추가 컨텍스트를 제공하면 장기적인 가치가 향상됩니다.
Alex Riabov

1
이거 확실하니? 이 숫자에 문자열하지만, JSON 문자열로 배열 변환하지 않습니다
니코 하세

예, @NicoHaase 숫자가 배열의 문자열 형식이면 숫자로 변환됩니다.
Dominic Amal Joe F

5

문자열에 유형 번호로 변환되도록 숫자에 1을 곱하십시오.

//String value
$string = "5.1"
if(is_numeric($string)){
  $numeric_string = $string*1;
}

충분히 공평하지만이 방법 (및 유사한 트릭) 은이 질문에 대한 24 가지 다른 답변에 이미 나열되어 있습니다. 다시 게시해도 가치가 없습니다.
DavidW

4

당신이 사용할 수있는:

((int) $var)   ( but in big number it return 2147483647 :-) )

그러나 가장 좋은 해결책은 다음을 사용하는 것입니다.

if (is_numeric($var))
    $var = (isset($var)) ? $var : 0;
else
    $var = 0;

또는

if (is_numeric($var))
    $var = (trim($var) == '') ? 0 : $var;
else
    $var = 0;

2

다음과 같이 데이터 유형을 변경할 수 있습니다

$number = "1.234";

echo gettype ($number) . "\n"; //Returns string

settype($number , "float");

echo gettype ($number) . "\n"; //Returns float

역사적인 이유로 float의 경우 "double"이 반환됩니다.

PHP 문서


2

모든 제안은 숫자 유형을 잃습니다.

이것은 나에게 모범 사례 인 것 같습니다.

function str2num($s){
// Returns a num or FALSE
    $return_value =  !is_numeric($s) ? false :               (intval($s)==floatval($s)) ? intval($s) :floatval($s);
    print "\nret=$return_value type=".gettype($return_value)."\n";
}

1

PHP는 한계 내에서 당신을 위해 그것을 할 것입니다

<?php
   $str = "3.148";
   $num = $str;

   printf("%f\n", $num);
?>

나는 그것을 내놓고 싶지 않다. 변환하고 변수에 저장하고 싶습니다.
Sara

1
이것은 자동적으로 플로트로 변환했습니다. PHP의 느슨한 타입 변환이 당신을 위해 그것을합니다. 예상대로 작동하지 않을 수 있으므로 명시 적 변환을 사용하는 다른 답변이 더 효과적 일 수 있습니다.
Adrian Cornish

$ str은 printf ( "% f \ n", $ str) '5'를 사용하여 '5'또는 '5.258'을 포함 할 수 있습니다. 더 많은 소수점.
Sara

1

방법이 있습니다 :

$value = json_decode(json_encode($value, JSON_NUMERIC_CHECK|JSON_PRESERVE_ZERO_FRACTION|JSON_UNESCAPED_SLASHES), true);

가 a is_*이므로 사용 이 작동하지 않습니다 .variablestring

의 조합을 사용 json_encode()하고 json_decode()그것은 그것의 "진정한"형태로 변환합니다. 그것이 사실 string이라면 그것은 잘못 출력 될 것입니다.

$num = "Me";
$int = (int)$num;
$float = (float)$num;

var_dump($num, $int, $float);

출력합니다 : string(2) "Me" int(0) float(0)


0

프로그래밍 인터뷰에서 "PHP에서 정수를 문자열로 캐스트하는 내장 함수를 작성하고 있다고 가정합니다. 그 함수를 어떻게 작성할 것입니까?" 해결책은 다음과 같습니다.

$nums = ["0","1","2","3","4","5","6","7","8","9"];
$int = 15939; 
$string = ""; 
while ($int) { 
    $string .= $nums[$int % 10]; 
    $int = (int)($int / 10); 
} 
$result = strrev($string);

0

나는 답변을 읽었으며 PHP의 숫자 변환에서 가장 큰주의를 언급 한 사람을 보지 못했습니다.

가장 많이 답한 답변은 다음을 수행하는 것입니다.

$str = "3.14"
$intstr = (int)$str // now it's a number equal to 3

훌륭합니다. PHP는 직접 캐스팅을 수행합니다. 그러나 우리가 다음을 수행한다면 어떨까요?

$str = "3.14is_trash"
$intstr = (int)$str

PHP는 그러한 변환이 유효하다고 생각합니까?

분명히 그렇습니다 .

PHP는 필요한 유형의 숫자가 아닌 첫 번째 문자를 찾을 때까지 문자열을 읽습니다. 정수의 경우 숫자는 [0-9]입니다. 결과적으로 3문자 범위가 [0-9]이므로 읽기를 계속합니다. 읽는다.[0-9] 범위에 있지 않으므로 멈 춥니 다.

플로팅이나 더블로 캐스팅하는 경우에도 마찬가지입니다. PHP 읽을 것이다 3다음, .다음 1, 다음 4,과에서 멈출 것 i이 유효 부동 소수점 숫자 문자가 아닙니다이기 때문에.

결과적 "million" >= 1000000으로 false로 "1000000million" >= 1000000평가 되지만로 평가됩니다 true.

또한보십시오:

https://www.php.net/manual/en/language.operators.comparison.php 비교하는 동안 변환이 수행되는 방법

https://www.php.net/manual/en/language.types.string.php#language.types.string.conversion 문자열이 각 숫자로 변환되는 방법


0

부동 소수점이나 정수가 있는지 미리 알지 못하고
문자열에 공백, € 등의 특수 문자
가 포함되어 있고 1 점이나 쉼표가 포함되어
있으면이를 사용할 수 있습니다 함수:

// This function strip spaces and other characters from a string and return a number.
// It works for integer and float.
// It expect decimal delimiter to be either a '.' or ','
// Note: everything after an eventual 2nd decimal delimiter will be removed.
function stringToNumber($string) {
    // return 0 if the string contains no number at all or is not a string:
    if (!is_string($string) || !preg_match('/\d/', $string)) {
        return 0;
    } 

    // Replace all ',' with '.':
    $workingString = str_replace(',', '.', $string);

    // Keep only number and '.':
    $workingString = preg_replace("/[^0-9.]+/", "", $workingString);

    // Split the integer part and the decimal part,
    // (and eventually a third part if there are more 
    //     than 1 decimal delimiter in the string):
    $explodedString = explode('.', $workingString, 3);

    if ($explodedString[0] === '') {
        // No number was present before the first decimal delimiter, 
        // so we assume it was meant to be a 0:
        $explodedString[0] = '0';
    } 

    if (sizeof($explodedString) === 1) {
        // No decimal delimiter was present in the string,
        // create a string representing an integer:
        $workingString = $explodedString[0];
    } else {
        // A decimal delimiter was present,
        // create a string representing a float:
        $workingString = $explodedString[0] . '.' .  $explodedString[1];
    }

    // Create a number from this now non-ambiguous string:
    $number = $workingString * 1;

    return $number;
}

-8

다른 접근법 :

  1. 배열 / 연관 배열로 모두 밀어 넣으십시오.
  2. json_encode($your_array, JSON_NUMERIC_CHECK); 선택적으로 다시 디코딩
  3. ?
  4. 이익!

7
스택 오버플로는 농담이 아닌 질문에 대한 답변입니다. 나는 거기에 거기에 대한 장소가 있다고 확신하지만이 곳이 아닙니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.