我的电话号码将在我的数据库中记录为int(例如1234512312345),但我想在网页上表示为(12345)123 - 12345。如果它是一个字符串我会使用substr但是将它转换为strval似乎是不优雅的。
虽然我理解整数和字符串是截然不同的,但是如果不自己编写一个效率低下的函数,有没有办法对这种效果做些什么呢?
答案 0 :(得分:9)
您可以vprintf
尝试vsprintf或sscanf$data = 1234512312345;
vprintf("(%d)-%d-%d",sscanf($data, "%5d%3d%5d"));
(12345)-123-12345
*的注意
如果你想要返回它有一个值,那么它应该是
$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
)%
运算符,有助于获取最后一位数字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插件来执行此操作。
我的最爱: