【问题标题】:PHP: Conversion String to integer without deleting leading zeroesPHP:将字符串转换为整数而不删除前导零
【发布时间】:2011-11-08 10:50:56
【问题描述】:

我有一个输入字段,其中包含用于 chmod 的文件模式。

如果我使用它,它被用作字符串,所以它失败了。我将其转换为 int (intval()),它会删除前导零 (0777 => 777) 并再次失败。如果我这样使用它:

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

这也失败了,因为is_int($finished) 是假的。

我该如何解决这个问题?

【问题讨论】:

    标签: php int


    【解决方案1】:

    前导零对于整数来说是一个不存在的概念,因为它们在数学上是微不足道的。在十进制表示法中,整数0777 简单而精确地等于777

    但是,如果您尝试将八进制表示法的 "0777" 转换为其整数对应物(511 作为十进制数)以与 chmod() 一起使用,则可以使用 octdec($input)。该函数接受一个字符串并输出一个整数,完全按照它在锡上所说的那样做。

    当然,请务必先执行验证,例如通过使用正则表达式。您不想将全局或无效标志交给chmod(),并可能将您的敏感文件和文件夹暴露给公众。

    【讨论】:

    • 这个答案是正确的。但是,如果您只是为了验证输入而这样做,那么正则表达式可能更有用,因为它实际上能够检测到无效数据,而不是仅仅将无效数据转换为一些“任意”整数。
    • @Matthew:也可以进行消毒:stackoverflow.com/questions/8049245/…
    【解决方案2】:

    您正在使用输入字段来获取$input。这意味着该值是一个字符串。

    您正在该值内寻找octal numberintval 没有将字符串作为八进制数处理。

    chmod 期望 $mode 参数为整数值。

    要转换包含八进制数的字符串,可以使用octdec 函数:

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

    因此,您可能希望验证输入并检查它是否也符合八进制数的要求,例如通过使用decoct 再次转换并测试其结果是否相同:

    $valid = "0".decoct($int) === $value;
    

    【讨论】:

      【解决方案3】:

      尝试使用 preg_match() 检查输入。参考下面的代码。

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

      谢谢。

      【讨论】:

        【解决方案4】:

        没有什么可解决的,整数类型不能以0开头,除非它等于0。0777的值等于777,通常设置权限为777没有问题,系统会知道将其视为0777.

        如果您必须传递前导零,则它必须是字符串(例如 '0'.$finished

        夏。

        【讨论】:

          【解决方案5】:

          当你使用函数 0 时。 $int; php理解是一个操作添加两个字符串。所以结果 $finished 将是一个字符串。尝试使用函数 number_format 来解决。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-04-09
            • 1970-01-01
            • 2019-07-08
            • 1970-01-01
            • 1970-01-01
            • 2014-07-17
            • 1970-01-01
            相关资源
            最近更新 更多