PHP: преобразовать строку в float (только если string представляет float)

#php #string #type-conversion

#php #строка #тип-преобразование

Вопрос:

У меня есть неизвестная строка, которая может напоминать float. В этом случае я хочу преобразовать ее в float (для вычислений), в противном случае оставить ее в виде строки.

Как мне определить, представляет ли строка число с плавающей запятой?

 $a = "1.23";        // convert $a to 1.23
$b = "1.2 to 1.3";  // leave $b as is
  

Автоматическое преобразование строки преобразовало бы последнюю в 1.2 , но это не то, что я хочу.

Комментарии:

1. Как насчет просто 1 ? php.net/manual/en/function.is-numeric.php

Ответ №1:

Вы можете использовать функцию is_numeric() для проверки переменной, которая может содержать число. Например:

 $a = "1.23";
if (is_numeric($a)) {
    $a = (float)$a;
}

$b = "1.2 to 1.3";
if (is_numeric($b)) {
    $b = (float)$b;
}

var_dump([
    'a' => $a,
    'b' => $b
]);
  

Вывод

массив (размер = 2) ‘a’ => float 1.23 ‘b’ => строка ‘1.2 — 1.3’ (длина = 10)

Ответ №2:

Вы можете использовать следующее, чтобы проверить, является ли строка float:

 $a = "1.23";
$isFloat = ($a == (string)(float)$a);
  

Ответ №3:

 function StrToFloat($var){
    if(is_numeric($var)){
        return (float)$var;
    } else return $var;
} 

$a = "1.23";        // convert $a to 1.23
$b = "1.2 to 1.3";  // leave $b as is

$a = StrToFloat($a); // $a = 1.23
$b = StrToFloat($b); // $b = "1.2 to 1.3"
  

Комментарии:

1. Фактически то же самое, что и ответ @Maxim, только красиво обернутый внутри функции.

Ответ №4:

Потому что это не было упомянуто

 if(preg_match('/^d .d $/', $string)){
   $float = (float)$string;
}
  

Я думаю, is_numeric это лучший выбор, но это тоже работает.

То, что у меня есть выше, соответствует только числам с плавающей запятой, поэтому они должны иметь десятичную дробь. Чтобы сделать это необязательным, используйте /^d (.d )?$/ вместо этого.

  • ^ начало строки
  • d одна или более цифр
  • . точка, буквально
  • d одна или более цифр
  • $ конец строки

Для второго /^d (.d )?$/ это то же самое, что и выше, за исключением этого добавления:

  • (...)? необязательная группа захвата, сопоставьте этот столбец 0 или 1 раз.

Теперь должно быть очевидно, что десятичное число является необязательным.

Приветствия!

Ответ №5:

возможно, вы хотели бы использовать не зависящую от локали функцию floatval:

float floatval ( mixed $var ) — Возвращает значение строки с плавающей точкой.

Пример из документации:

 $string = '122.34343The';
$float  = floatval($string);
echo $float; // 122.34343
  

Комментарии:

1. Я не понимаю, как это работает. floatval($string) == $string кажется, что это всегда верно.

2. обычно он возвращает только float (0, если это не числовое значение, а значение float), но, перечитав ваш пост, я понимаю, что $b = "1.2 to 1.3" также вернет 1.2 sorry