【问题标题】:Is there a function in PHP akin to substr() for integers?PHP 中是否有类似于整数的 substr() 函数?
【发布时间】:2013-04-08 10:14:52
【问题描述】:

我有一个电话号码,它将在我的数据库中记录为 int(例如 1234512312345),但我想在网页上表示为 (12345) 123 - 12345。如果它是一个字符串,我会使用 substr,但将其转换为 strval 似乎不太优雅。

虽然我很欣赏整数和字符串在分类上是不同的,但有没有办法在不自己编写效率较低的函数的情况下做一些事情?

【问题讨论】:

  • 松散输入的乐趣... substr() 是您正在寻找的函数... 为什么您认为将其转换为字符串是不雅的?特别是因为你甚至不需要使用 strval()
  • 为什么不直接使用 substr,不用考虑这些问题呢? 即使如果它需要你“不优雅”的手动类型转换。一个凭空出现的不是真正问题的例子。
  • 真诚地,我会将它们存储为字符串,这样您就可以避免数字上的加号或前导 0 出现问题,并且您不会发现电话号码比其他号码“更高”之类的东西那(算术运算或比较)你不需要使用 int 字段,是的,你会节省一些空间,但真的有那么多空间吗?
  • 如果电话号码以0开头,如果将其存储为整数,第一个数字是否会丢失?

标签: php int substr


【解决方案1】:

请试试这个代码。

<?php
   $data = 1234512312345;
   echo "(".substr($data, 0, 5).") ".substr($data, 5, 3)."-".substr($data,8);
?>

【讨论】:

    【解决方案2】:

    您可以尝试vprintfvsprintfsscanf

    $data = 1234512312345;
    vprintf("(%d)-%d-%d",sscanf($data, "%5d%3d%5d"));
    

    Output

    (12345)-123-12345
    

    Multiple PHP Version Test

    *注意

    如果你想返回它有一个值那么它应该是

    $var = vsprintf("(%d)-%d-%d",sscanf($data, "%5d%3d%5d"));
            ^
            |---- Note the `s`
    

    【讨论】:

    • +1 用于阅读问题,并看到 OP 显然不想转换为字符串
    【解决方案3】:

    注意:回答这个是因为标题,将电话号码视为整数不是一个好主意

    您应该利用 PHP 的类型处理功能并在电话号码上使用字符串函数,但如果您想使用 C 风格并保持使用整数你有:

    • division/ 运算符,有助于获取第一个数字(将123 划分为100 会给你第一个数字,但不正确因为123/100=1.23,使用floor() 函数会给你floor(123/100)=1 但我们可能在这里遇到问题,因为floor() 的结果是float 类型而不是integer
    • modulo% 运算符,有助于获取最后一位数字(123 modulo 10 将立即为您提供最后一位数字和类型整数,例如123%10=3)

    所以你可以像这样(整数方式)从你的电话号码中提取所需的部分:

    $last=$no%100000; // get last 5 digits (modulo by 1 followed by 5 zeroes)
    
    $no=$no-$last; // subtract the last digits from original number
    
    $no=$no/100000; // divide to shorten the number, end up with a natural number
    
    $area=$no%1000; // get last 3 again
    
    $prefix=($no-$area)/1000; //remainder is the first digits of the original number
    

    或(float/double/real 方式)- 更具可读性

    $last=$no%1e5; // scientific notation 1e5 = 10000 (1 followed by 5 zeroes)
    
    $no=($no-$last)/1e5;
    
    $area=$no%1e3;
    
    $prefix=($no-$area)/1e3;
    

    直播代码:http://codepad.viper-7.com/tVRjXC

    注意:科学计数法e使用类型float

    您还应该记住,32 位平台上的最大整数是2^31 = 2.147.483.648


    现在,将此代码与0077705501234 之类的“电话号码”一起使用会让您头疼!

    所以它来自数据库,但如果有任何更改,它会显示为真正的int PHP 将解释 octal base 中的任何 0 前导数字并在内部将其转换为十进制所以你最终会得到一个完全不同的“电话号码”,确切地说是垃圾。

    如果 PHP 将它作为 string 接收,并且您真的想使用整数,您可以使用 type-cast 使用 (int) $no 或使用 $no+0 等进行转换。

    无论如何,前导零对整数无关紧要,但对于字符串则如此,因此您最终可能会得到 77705501234 并且您可能想要进行长度检查(integer 浮点方式):

    我要使用浮点数,因为有很多零需要依靠......

    我们知道该号码必须包含 13 数字,因此我们可以检查 if ( $no &gt; 1e12 ) 并且可能还检查 if ( $no &lt; 1e14 ) 以进行验证。

    如果你还想知道数字的“长度”(你需要知道pow()):

    for ($i=1;$i<13;$i++) { //count from 1 to 12
        //stop when $no modulo 10^$i is the number
        if ( $no % pow(10,$i) == $no ) break; 
    }
    // number of digits of $no are stored in $i - equivalent to strlen()
    

    最后,即使缺少前导零整数,也能正确打印您的号码:

    printf('Your number: (%05u) %03u - %05u',$prefix,$area,$last);

    直播代码:http://codepad.viper-7.com/Xgr8RQ

    旁注:对于大数字,您也有 BCMath 函数,但它们适用于字符串

    【讨论】:

      【解决方案4】:

      最好不要将电话号码存储和处理为整数,而只是作为字符串。

      因此,使用strval() 将您的号码转换为字符串,然后您可以使用substr() 和所有其他字符串函数。

      【讨论】:

      • 不知道为什么这被否决了,但将电话号码存储为字符串是明智的建议,因为它们通常包含前导零,在任何存储为数字时都会丢失
      【解决方案5】:

      是否只显示在网页上?

      如果是,您可以使用一个 jquery 插件来做到这一点。

      对我来说最好的:

      http://digitalbush.com/projects/masked-input-plugin/

      http://igorescobar.github.io/jQuery-Mask-Plugin/

      【讨论】:

        【解决方案6】:

        试试这个,,,

        <?php
        $phone = "1234512312345";
        //(12345) 123 - 12345
        
        $array = str_split($phone,5);
        $array1 = substr($phone,5, 3);
        $array2 = substr($phone,8, 5);
        
        echo "(".$array[0].") ".$array1."-".$array2;
        ?>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-27
          • 2011-08-01
          • 2011-10-26
          • 1970-01-01
          • 2013-12-11
          • 2011-08-26
          • 1970-01-01
          相关资源
          最近更新 更多