나는 값, 이러한 유형의 변환 할 '3'
, '2.34'
, '0.234343'
숫자로 등. JavaScript에서는을 사용할 수 Number()
있지만 PHP에서 사용할 수있는 비슷한 방법이 있습니까?
Input Output
'2' 2
'2.34' 2.34
'0.3454545' 0.3454545
나는 값, 이러한 유형의 변환 할 '3'
, '2.34'
, '0.234343'
숫자로 등. JavaScript에서는을 사용할 수 Number()
있지만 PHP에서 사용할 수있는 비슷한 방법이 있습니까?
Input Output
'2' 2
'2.34' 2.34
'0.3454545' 0.3454545
답변:
PHP는 대부분의 상황에서 유형을 강제하기 때문에 일반적으로이 작업을 수행 할 필요는 없습니다. 명시 적으로 유형을 변환하려는 경우 유형을 캐스트 하십시오.
$num = "3.14";
$int = (int)$num;
$float = (float)$num;
.
소수점 구분 기호 로 가정하는 것이 안전하지 않을 수 있습니다 . en.wikipedia.org/wiki/…
그렇게하는 몇 가지 방법이 있습니다.
문자열을 숫자 기본 데이터 유형으로 캐스트하십시오.
$num = (int) "10";
$num = (double) "10.12"; // same as (float) "10.12";
문자열에서 수학 연산을 수행하십시오.
$num = "10" + 1;
$num = floor("10.1");
사용 intval()
또는 floatval()
:
$num = intval("10");
$num = floatval("10.1");
사용하십시오 settype()
.
(double)
단지의 별칭입니다 (float)
.
$num = "10" + 1
예).
intval("9999999999")==2147483647
.
intval
array_map('intval', $arrayOfStrings);
캐스팅으로는 할 수없는 것을 사용할 수 있기 때문에 유용합니다 .
$num = "10" + 1;
그것을 사용하는 것이 좋습니다 $num = "10" * 1;
값 (곱셈의 중립 요소) 변경되지 않습니다 때문에,이 같은 본질적으로 toNumber(..)
최종 유형이 문자열을 변환하는 데 필요한 무엇에 의해 결정되기 때문에이 "10"-> (INT) 10; "10.1"-> (플로트) 10.1;
문제를 피하기 위해 시도하십시오 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
?>
12.7896
있습니까?
(int)$my_str
내가 처리 된 이후 것없는 일을 구체적으로 문자열 liks로 01
하고 013
내가베이스 10로 해석 할 것인지 ... 그래서 명시 적 기반을 제공 할 수있는 방법을 원했다.
(느슨하게 타이핑 된) 언어에서 0을 추가하여 항상 문자열을 숫자로 변환 할 수 있습니다.
그러나 PHP는이 변수를 사용할 때 자동으로 수행하므로 출력시 문자열로 캐스팅되기 때문에 의미가 거의 없습니다.
부동으로 캐스팅 한 후 부동 숫자의 특성으로 인해 예기치 않게 변경 될 수 있기 때문에 점으로 구분 된 숫자를 문자열로 유지하려고 할 수 있습니다.
typeof('123'+0)
부여 'string'
하기 때문에, '123'+0
제공합니다 '1230'
.
0+'123'
얻을 0 을 숫자를 추가해야합니다123
당신이 사용할 수있는:
(int)(your value);
또는 다음을 사용할 수 있습니다.
intval(string)
is_float
인지 확인하고 통과하면 (float)
대신 로 캐스트합니다 (int)
.
에 대한 부동 소수점을 원 $value = '0.4'
하지만 int에 대해서는 다음 $value = '4'
과 같이 쓸 수 있습니다.
$number = ($value == (int) $value) ? (int) $value : (float) $value;
조금 더럽지 만 작동합니다.
strpos($val, '.') === false ? intval($val) : floatval($val);
localeconv()['decimal_point']
대신 사용할 수 있다고 생각합니다 '.'
. 이 strpos
솔루션 의 한 가지 장점은 두 배 캐스팅보다 거의 2 배 빠르다는 것입니다.
2.1e2
소수점이 있지만 결과 숫자는 정수입니다.
+
ID 연산자를 사용하십시오 : var_dump(+'0.4', +'4')
, float 및 int를 제공합니다. php.net/manual/en/language.operators.arithmetic.php
당신은 항상 그것에 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
. 어떤 생각?
그렇습니다. PHP에는 비슷한 방법이 있지만 거의 알지 못합니다. 여기에 설명 된대로 " identity " 라는 산술 연산자입니다 .
숫자 문자열을 숫자로 변환하려면 다음과 같이하십시오.
$a = +$a;
is_numeric
어떤 경우에는 유용하고 더 안전 할 수있는 답변에 대한 약간의 메모입니다. 문자열에 실제로 유효한 숫자 값이 포함되어 있는지 확인한 다음 숫자 형식으로 변환해야합니다 (예 : 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
원하는 것을 달성하는 기능은 다음과 같습니다. 먼저 값을 숫자로 이해할 수 있는지 확인하여 값을 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;
}
}
JavaScript에서 문자열을 숫자로 변환하는 간단한 방법은 문자열에 1을 곱하는 것입니다. "+"기호는 JavaScript에서 여러 용도를 사용하고 "*"기호는 순전히 연결 문제를 해결합니다. 수학적 곱셈.
PHP에서 숫자가 포함 된 문자열을 숫자로 자동으로 기꺼이 해석하려는 PHP와 관련하여 여기에서 본 내용 (및 PHP에서 "+"는 수학적으로 추가하기 때문에 추가에 대한 주석)을 바탕 으로이 곱하기 트릭은 잘 작동합니다. PHP도 마찬가지입니다.
나는 그것을 테스트했으며 작동합니다 ... 문자열을 어떻게 획득했는지에 따라 1을 곱하기 전에 trim () 함수를 적용 할 수 있습니다.
다음은 스스로 단순화하기 위해 작성한 함수입니다.
또한 부울, 정수, 이중 및 실수의 속기 버전을 반환합니다.
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';
Boykodev의 답변 외에도 다음과 같이 제안합니다.
Input Output
'2' * 1 2 (int)
'2.34' * 1 2.34 (float)
'0.3454545' * 1 0.3454545 (float)
$id_cron = (string)date('YmdHi'); $target_id_cron = $id_cron - 1;
$ target_id_cron = (int) $ id_cron-1;
A non well formed numeric value encountered
string을 float로 변경하려고 할 때이 오류가 발생했습니다 $num = '12,24' * 1
. 어떠한 제안?
간단히 다음과 같이 쓸 수 있습니다.
<?php
$data = ["1","2","3","4","5"];
echo json_encode($data, JSON_NUMERIC_CHECK);
?>
당신이 사용할 수있는:
((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;
PHP는 한계 내에서 당신을 위해 그것을 할 것입니다
<?php
$str = "3.148";
$num = $str;
printf("%f\n", $num);
?>
방법이 있습니다 :
$value = json_decode(json_encode($value, JSON_NUMERIC_CHECK|JSON_PRESERVE_ZERO_FRACTION|JSON_UNESCAPED_SLASHES), true);
가 a is_*
이므로 사용 이 작동하지 않습니다 .variable
string
의 조합을 사용 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)
나는 답변을 읽었으며 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 문자열이 각 숫자로 변환되는 방법
부동 소수점이나 정수가 있는지 미리 알지 못하고
문자열에 공백, € 등의 특수 문자
가 포함되어 있고 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;
}