PHP: преобразование строки в целое число без удаления начальных нулей - PullRequest
4 голосов
/ 08 ноября 2011

У меня есть поле ввода, которое содержит режим файла, используемый для chmod.

Если я использую это, он используется как строка, поэтому он не работает.Если я преобразую его в int (intval ()), он удаляет начальный ноль (0777 => 777) и снова завершается ошибкой.Если я использую это следующим образом:

$int = intval($input);
$finished = 0 . $int;

Это также не помогает, потому что is_int($finished) ложно.

Как я могу решить эту проблему?

Ответы [ 5 ]

5 голосов
/ 08 ноября 2011

Ведущие нули - это несуществующее понятие для целых чисел, потому что они математически незначимы.В десятичной записи целое число 0777 просто и точно равно 777.

Но если вы пытаетесь преобразовать "0777" в восьмеричной записи в его целочисленный аналог (511 как десятичное число) для использования с chmod(), вы можете использовать octdec($input).Функция берет строку и выдает целое число, выполняя в точности то, что написано на банке.

Конечно, сначала убедитесь, что вы выполняете проверку, например, с помощью регулярного выражения.Вы не хотите передавать глобальный или недействительный флаг на chmod() и потенциально открывать для доступа ваши конфиденциальные файлы и папки.

2 голосов
/ 08 ноября 2011

Вы используете поле ввода для получения $input.Это означает, что значение является строкой.

Вы ищете восьмеричное число внутри этого значения.intval не обрабатывает строки как восьмеричные числа.

chmod ожидает, что параметр $mode будет целочисленным значением.

Чтобы преобразовать строку, содержащую восьмеричное число, вы можете использовать функцию octdec:

$int = octdec($value); # '0777' -> 511

Так что вы можете проверить ввод и проверить, соответствует ли оно восьмеричнымчисло, например, снова преобразовав его с помощью decoct и проверив, приводит ли оно к тому же результату:

$valid = "0".decoct($int) === $value;
1 голос
/ 08 ноября 2011

Решать нечего, целочисленный тип не может начинаться с 0, если его значение не равно 0. 0777 равно 777 по значению. Обычно нет проблем с установкой разрешения 777, система будет знать, что его следует рассматривать как0777.

Если вы ДОЛЖНЫ пройти начальный ноль, он должен быть в виде строки (например, '0'.$finished)

Shai.

1 голос
/ 08 ноября 2011

Попробуйте проверить ввод с помощью preg_match (). см. код ниже.

if(preg_match("/[^0-9.]/", $input)) 
{
    return false;
}
else
{
  -- Some Code Here --
} 

Спасибо.

0 голосов
/ 08 ноября 2011

Когда вы используете функцию 0. $ ИНТ; PHP понимают, что это операция добавления двух строк. Итак результат $ done будет строкой попробуйте использовать функцию number_format для решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...