Ответ 1
// Try to convert the string to a float
$floatVal = floatval($num);
// If the parsing succeeded and the value is not equivalent to an int
if($floatVal && intval($floatVal) != $floatVal)
{
// $num is a float
}
Я пытаюсь проверить php, если строка является двойной или нет.
Вот мой код:
if(floatval($num)){
$this->print_half_star();
}
$num - это строка. Проблема в том, что даже когда есть int, она дает true. Есть ли способ проверить, является ли это float, а не int!?
// Try to convert the string to a float
$floatVal = floatval($num);
// If the parsing succeeded and the value is not equivalent to an int
if($floatVal && intval($floatVal) != $floatVal)
{
// $num is a float
}
Это опустит целочисленные значения, представленные в виде строк:
if(is_numeric($num) && strpos($num, ".") !== false)
{
$this->print_half_star();
}
Вы можете попробовать следующее:
function isfloat($num) {
return is_float($num) || is_numeric($num) && ((float) $num != (int) $num);
}
var_dump(isfloat(10)); // bool(false)
var_dump(isfloat(10.5)); // bool(true)
var_dump(isfloat("10")); // bool(false)
var_dump(isfloat("10.5")); // bool(true)
Почему бы не использовать магию регулярного выражения
<?php
$p = '/^[0-9]*\.[0-9]+$/';
$v = '89.00';
var_dump(preg_match($p, $v));
$v = '.01';
var_dump(preg_match($p, $v));
$v = '0.01';
var_dump(preg_match($p, $v));
$v = '89';
var_dump(preg_match($p, $v));
если "формат двойной строки" похож на этот "XXXXXX.XXXXXX"
попробуйте проверить
function check_double_string($str){
$pairs = explode('.',$str);
if ( is_array($pairs) && count($pairs)==2) {
return ( is_numeric($pairs[0]) && is_numeric($pairs[1])? true : false;
}
return false;
}
Чтобы получить все случаи с поплавком, нам нужно добавить нуль обратно в конец, который можно отрубить с помощью floatval()
или путем приведения типов (float)$num
$num='17.000010';
$num_float = (float)$num; //$num_float is now 17.00001
//add the zero back to $num_float
while (strlen ($num) > strlen ($num_float)) $num_float = $num_float . '0'; //$spot_float in now a string again
if($num_float != $num) then $num was no double :;
note !==
не использовалось только в случае, если $num_float
никогда не преобразовывался обратно в строку, добавляя нули. это будет иметь место для значений, которые не заканчиваются на 0.
Вы можете просто проверить, является ли значение числовым, а затем проверить десятичную точку, так что...
if(is_numeric($val) && stripos($val,'.') !== false)
{
//definitely a float
}
Он не обрабатывает экспоненциальное очень хорошо, хотя, так что вы, возможно, придется обрабатывать вручную, что, глядя на e
Вот что я создал для современного PHP:
/**
* Determines if a variable appears to be a float or not.
*
* @param string|int|double $number
* @return bool True if it appears to be an integer value. "75.0000" returns false.
* @throws InvalidArgumentException if $number is not a valid number.
*/
function isFloatLike($number): bool
{
// Bail if it isn't even a number.
if (!is_numeric($number)) {
throw new InvalidArgumentException("'$number' is not a valid number.");
}
// Try to convert the variable to a float.
$floatVal = floatval($number);
// If the parsing succeeded and the value is not equivalent to an int,
return ($floatVal && intval($floatVal) != $floatVal);
}