【问题标题】:Working with PHP Octals and String conversions使用 PHP 八进制和字符串转换
【发布时间】:2011-01-30 12:53:44
【问题描述】:

我正在使用一个数据库,该数据库有一堆以 0 为前缀的序列号。

所以序列号可能看起来像 00032432 或 56332432。

问题在于 PHP 我不明白八进制转换系统是如何工作的。

一个具体的例子是,我正在尝试将所有这些基于整数的数字与字符串进行转换和比较。

是否可以将八进制,例如 00234 转换为类似“00234”的字符串,以便我进行比较?

编辑 - 添加特定示例。我希望能够在串行上运行 str 函数,如下所示。

  $serial = 00032432; // coming from DB

  if(substr($serial, 0, 1) == '0') {

        // do something

   } 

【问题讨论】:

  • 我不明白你的确切问题?该值来自一个字符串,所以它不应该被视为八进制,直到你用它做一些数学运算,比如在加法中使用它。您应该能够在字符串比较中使用它,放下手。还是我误会了什么?
  • 在使用和比较之前将来自 db 的值分配给变量是否重要?因为我无法像处理没有前导零的数字或字符串那样操作这些变量。

标签: php string octal


【解决方案1】:

当你用(string) $number转换时,你总是得到一个以十进制为基数的字符串,不管你用八进制模式还是十进制模式写数字都没有关系,一个int是一个int,它本身没有一个基数.这是他的字符串表示,必须用一个基础来解释。

你可以通过这种方式得到一个数字的八进制字符串表示:

$str = base_convert((string) 00032432, 10, 8);

或以十进制代​​表给出数字:

$str = base_convert((string) 13594, 10, 8);    

或者,更简洁但不太清楚:

 $str = base_convert(00032432, 10, 8);
 $str = base_convert(13594, 10, 8);

最后,字符串转换是隐式进行的。这些示例给出了所有结果 $str = "32432"。

base_convert 将数字的字符串表示形式从一个基数转换为另一个数

如果您还想要字符串中的零,您可以用简单的数学添加它们。

希望对你有帮助。

【讨论】:

  • 在运行 base_convert 之前如何知道它是否为八进制?例如,我不想在非八进制上运行 base_convert,因为它会改变值。有没有办法在运行这个函数之前检查它并改变值?我只想在带有前导零的值上运行它。
  • 我不明白你的意思。我认为,您可以从数据库中获得字符串格式的数字。然后你有一个字符串,你可以检查零......但我想我还没有理解问题出在哪里,所以如果你给我更多关于问题的细节,更详细的例子......
  • 我从数据库中获取字符串并将它们分配给变量。当我尝试在它们上运行字符串函数时,它们不能处理带前导零的数字(即 00532),但是在没有前导零的数字(即 532)上工作正常。当我只对带有前导零的数字使用 base_convert 时,它可以正常工作,但是没有前导零的数字会被错误地转换。问题是我不知道要在哪些数字上使用 base_convert 函数,因为如果不先转换它们,我无法判断它们是否有前导零。那有意义吗?我以前从未听说过八进制=/
  • 但是如果字符串中已经有八进制数,为什么不能直接使用它们呢?并检查该字符串中的前导零?但是,您能否使用 base_convert 函数发布两种不同情况的示例,说明结果应该是什么?
  • 好的,通过调试器运行后,我发现应用程序中有一小行正在获取这些字符串并对它们执行操作(这导致了八进制转换)。我之所以选择这个作为答案,是因为推荐的 base_convert 函数极大地帮助解决了将字符串转换为八进制后比较字符串的原始问题。谢谢!
【解决方案2】:

要将八进制转换为字符串,请将其强制转换:

$str = (string) 00032432;

您可以使用函数 octdec 和 decoct 在八进制和十进制之间进行转换

<?php
echo octdec('77') . "\n";
echo octdec(decoct(45));
?>

http://uk.php.net/manual/en/function.octdec.php

【讨论】:

  • 我之前尝试过这些。八进制仍然显示为它们的等价物,而不是字符串。即 - 回声 octdec(decoct(045));当我希望它在字符串中显示为 045 时显示为 37。
【解决方案3】:
$str = sprintf('%o', $octal_value);

【讨论】:

    【解决方案4】:
    $serial = 00032432; //here you have an octal number
    $serial= strval($serial); //now you have a string
    if ($serial[0]=="0") {
     //do something
    }
    

    【讨论】:

    • 这不起作用。我在 if 语句中添加了一个回声,但它没有显示。 strval 和 (string) 之类的其他函数不适用于这些八进制数?感谢您的协助!
    • 好的,另一个问题,你如何让这个变量成为一个数字?从数据库接收到它后,您是否将其显式转换为 (int)?那就不要那样做了,因为它实际上不是一个数字,而是一个字符串!
    【解决方案5】:

    数据库中的所有内容都自动成为字符串。整数是字符串,日期是字符串,狗是字符串。

    如果您正在做一些奇怪的事情,请将任何内容转换为字符串:$a = (string) 12;

    【讨论】:

    • 我也试过这个。例如运行这个: $a = (string) 012; echo $a;.... 它回显 10 而不是 012。
    • @krio 这是有道理的,因为八进制值在字符串转换之前被转换。但是,在您的示例中不应该是这种情况。
    • 现在我读到了 - 我从数据库中获取变量,但是在使用之前它被分配了一个值。它没有直接插入到查询中。
    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2015-11-08
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    相关资源
    最近更新 更多