4

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

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

4

6 回答 6

11

您可以使用sscanf尝试vprintfvsprintf

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

输出

(12345)-123-12345

多个 PHP 版本测试

*注意

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

$var = vsprintf("(%d)-%d-%d",sscanf($data, "%5d%3d%5d"));
        ^
        |---- Note the `s`
于 2013-04-08T10:25:07.603 回答
7

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

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

  • 除法/运算符,有助于获取第一个数字(除法会给你第一个数字,但不是马上,因为,使用该函数会给你,但我们在这里可能会遇到问题,因为's 结果是类型而不是)123100123/100=1.23floor()floor(123/100)=1floor()floatinteger
  • modulo%运算符,有助于获取最后一位数字(模数会立即为您提供最后一位数字,并且是整数类型,例如。)12310123%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方式)-更具可读性doublereal

$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会让您头疼!

所以它来自数据库,但是如果通过任何更改它作为一个真正的intPHP 出现,它将解释任何以八进制为基数0的前导数字并在内部将其转换为十进制,所以你最终会得到一个完全不同的“电话号码”,垃圾到准确地说。

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

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

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

我们知道该号码必须有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函数,但它们适用于字符串

于 2013-04-08T13:32:34.840 回答
1

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

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

于 2013-04-08T10:17:13.953 回答
1

请尝试此代码。

<?php
   $data = 1234512312345;
   echo "(".substr($data, 0, 5).") ".substr($data, 5, 3)."-".substr($data,8);
?>
于 2013-04-08T10:22:53.430 回答
0

是否只显示在网页上?

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

对我来说最好的:

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

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

于 2013-04-08T10:27:57.970 回答
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;
?>
于 2013-04-08T10:22:37.833 回答