PHP中的函数是否类似于整数的substr()?

时间:2013-04-08 10:14:53

标签: php int substr

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

虽然我理解整数和字符串是截然不同的,但是如果不自己编写一个效率低下的函数,有没有办法对这种效果做些什么呢?

6 个答案:

答案 0 :(得分:9)

您可以vprintf

尝试vsprintfsscanf
$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 :(得分:7)

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

你应该利用PHP的类型杂耍功能并在你的电话号码上使用字符串函数,但如果你想这样做 C 样式并保持使用整数你有:

  • 分区 / 运算符,有助于获取第一个数字(将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的形式收到它并且您真的想要使用整数,那么您可以使用(int) $no type-cast或使用$no+0等进行转换。

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

我要使用浮动,因为有很多零值可以依赖......

我们知道该号码必须为13位,因此我们可以检查if ( $no > 1e12 ),也可以if ( $no < 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个函数,但它们可以使用字符串

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

试试这个,,,

<?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;
?>

答案 4 :(得分:0)

请尝试使用此代码。

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

答案 5 :(得分:0)

仅在WebPage上显示吗?

如果是,您可以使用一个jquery插件来执行此操作。

我的最爱:

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

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