Ответ 1
Обычно вам не нужно это делать, поскольку PHP в большинстве случаев будет принуждать вас к типу. В ситуациях, когда вы хотите явно преобразовать тип, cast:
$num = "3.14";
$int = (int)$num;
$float = (float)$num;
Я хочу преобразовать эти типы значений '3'
, '2.34'
, '0.234343'
и т.д. в число. В JavaScript мы можем использовать Number()
, но есть ли какой-либо подобный метод, доступный в PHP?
Input Output
'2' 2
'2.34' 2.34
'0.3454545' 0.3454545
Обычно вам не нужно это делать, поскольку PHP в большинстве случаев будет принуждать вас к типу. В ситуациях, когда вы хотите явно преобразовать тип, cast:
$num = "3.14";
$int = (int)$num;
$float = (float)$num;
Есть несколько способов сделать это:
Передача строк в числовые примитивные типы данных:
$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()
.
На любом (слабо типизированном) языке вы всегда можете передать строку в число, добавив к ней нуль.
Однако в этом очень мало смысла, поскольку PHP будет делать это автоматически во время использования этой переменной, и в любом случае он будет передан в строку во время вывода.
Обратите внимание, что вы можете захотеть сохранить точечные числа в виде строк, потому что после кастинга до плавания его можно непредсказуемо изменить из-за природы чисел с плавающей запятой.
Чтобы избежать проблем, попробуйте 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
?>
Вы можете использовать:
(int)(your value);
Или вы можете использовать:
intval(string)
Если вы хотите получить значение с плавающей запятой для $value = '0.4'
, но int для $value = '4'
, вы можете написать:
$number = ($value == (int) $value) ? (int) $value : (float) $value;
Это немного грязно, но это работает.
Например, вы можете использовать (int)_value_
.
$string = '100';
$int = (int)$string;
См. Тип Жонглирование.
В PHP вы можете использовать функции intval(string) or floatval(string)
для преобразования строк в числа.
Вместо того, чтобы выбирать, преобразовывать ли string
в int
или 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;
Вы всегда можете добавить к нему нуль!
Input Output
'2' + 0 2 (int)
'2.34' + 0 2.34 (float)
'0.3454545' + 0 0.3454545 (float)
Небольшое примечание к ответам, которые могут быть полезными и безопасными в некоторых случаях.
Вы можете проверить, действительно ли строка содержит действительное числовое значение и только затем преобразовать его в числовой тип (например, если вам нужно манипулировать данными, поступающими из db, который преобразует ints в строки). Вы можете использовать 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;
}
}
Вот функция, которую я написал для упрощения для себя:
Он также возвращает сокращенные версии логических, целых, двойных и реальных.
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 ( "5", true) вернет int
type ( "3.7", true) вернет float
type ( "500" ) вернет строку
Просто будьте осторожны, поскольку это своего рода метод ложной проверки, и ваша фактическая переменная все равно будет строкой. При необходимости вам нужно будет преобразовать действительную переменную в правильный тип. Мне просто нужно было проверить, должна ли база данных загружать идентификатор элемента или псевдоним, поэтому никаких неожиданных эффектов не будет, поскольку в любом случае он будет разбираться как строка во время выполнения.
Edit
Если вы хотите определить, являются ли объекты функциями, добавьте этот случай к коммутатору:
case 'object': return is_callable($mixed)?'function':'object';
Я обнаружил, что в JavaScript простой способ преобразования строки в число - это умножить ее на 1. Она разрешает проблему конкатенации, потому что символ "+" имеет множество применений в JavaScript, а "*" - символ является чисто математическим умножением.
Основываясь на том, что я видел здесь в отношении PHP, автоматически готов интерпретировать строку, содержащую цифру, в виде числа (и комментарии о добавлении, поскольку в PHP "+" используется исключительно для математического добавления), этот многократный трюк отлично работает и для PHP.
Я тестировал его, и он работает... Хотя в зависимости от того, как вы приобрели строку, вы можете применить к ней функцию trim(), прежде чем умножить на 1.
$num = "3.14";
$int = (int)$num; // Output = 3
$float = (float)$num; // Output = 3.14
$double = (double)$num; // Output = 3.14
Вы можете преобразовать строку в число в PHP, используя приведение.
В дополнение к ответу Бойкодева я предлагаю следующее:
Input Output
'2' * 1 2 (int)
'2.34' * 1 2.34 (float)
'0.3454545' * 1 0.3454545 (float)
Да, в PHP есть похожий метод, но он настолько мало известен, что вы редко будете слышать об этом. Это арифметический оператор, называемый " тождество ", как описано здесь:
Чтобы преобразовать числовую строку в число, выполните следующие действия:
$a = +$a;
Вы можете просто использовать intval()
для преобразования строки в int.
Просто вы можете написать так:
<?php
$data = ["1","2","3","4","5"];
echo json_encode($data, JSON_NUMERIC_CHECK);
?>
$a = "10";
$b = (int)$a;
Вы можете использовать это, чтобы преобразовать строку в int в PHP.
Вы можете использовать:
((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
$string = '5'; // The $ string is a variable to hold string '5'
$int = intval($string); // $int is the converted string to integer $int = intval('5');
echo $int; // 5
?>
Для вашего конкретного случая вы можете просто умножить на 1, чтобы преобразовать строку в число в PHP. PHP заботится о плавающих и целых числах автоматически.
$num = "2.12";
var_dump(is_float($num)); // bool(false)
var_dump(is_int($num)); // bool(false)
var_dump(is_string($num)); // bool(true)
$num = $num*1;
var_dump(is_float($num)); // bool(true)
var_dump(is_int($num)); // bool(false)
var_dump(is_string($num)); // bool(false)
PHP сделает это за вас в определенных пределах
<?php
$str = "3.148";
$num = $str;
printf("%f\n", $num);
?>
Вы можете изменить тип данных следующим образом
$number = "1.234";
echo gettype ($number) . "\n"; //Returns string
settype($number , "float");
echo gettype ($number) . "\n"; //Returns float
По историческим причинам "double" возвращается в случае поплавка.
Все предложения теряют числовой тип.
Это кажется мне лучшей практикой:
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";
}
У меня возник вопрос "скажем, вы пишете встроенную функцию для преобразования целого числа в строку в 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);
Есть выход:
$value = json_decode(json_encode($value, JSON_NUMERIC_CHECK|JSON_PRESERVE_ZERO_FRACTION|JSON_UNESCAPED_SLASHES), true);
Использование 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 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
оценивается как ложное, а "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 как строки преобразуются в соответствующие числа
$a = "7.2345";
$b = round(((float)$a),0);