我有一个电话号码,将在我的数据库中记录为int(例如1234512312345),但我想在网页上表示为(12345)123 - 12345.如果它是一个字符串我会使用substr但是将它转换为strval似乎不太优雅.
虽然我理解整数和字符串是完全不同的,但是有没有办法在不编写效率低于函数的情况下为此效果做些什么呢?
Bab*_*aba 11
您可以使用sscanf尝试vprintf 或 vsprintf
$data = 1234512312345;
vprintf("(%d)-%d-%d",sscanf($data, "%5d%3d%5d"));
Run Code Online (Sandbox Code Playgroud)
(12345)-123-12345
Run Code Online (Sandbox Code Playgroud)
*注意
如果你想要返回它有一个值,那么它应该是
$var = vsprintf("(%d)-%d-%d",sscanf($data, "%5d%3d%5d"));
^
|---- Note the `s`
Run Code Online (Sandbox Code Playgroud)
注意:因为标题而回答这个问题,将电话号码视为整数并不是一个好主意
你应该利用PHP的类型 - 杂耍功能,并使用字符串函数而不是你的电话号码,但如果你想做C风格并保持使用整数你有:
/操作员分工,有助于获得第一个数字(分123给100会给你的第一个数字,但不是马上,因为123/100=1.23,使用floor()功能会给你floor(123/100)=1,但我们会在这里有一个问题,也因为floor()的结果是一个类型的float,而不是integer)%运算符,有助于获取最后的数字(123模数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
Run Code Online (Sandbox Code Playgroud)
或(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;
Run Code Online (Sandbox Code Playgroud)
实时代码: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()
Run Code Online (Sandbox Code Playgroud)
最后,即使缺少前导零整数,也要正确打印您的数字:
printf('Your number: (%05u) %03u - %05u',$prefix,$area,$last);
实时代码:http://codepad.viper-7.com/Xgr8RQ
旁注:对于大数字,您也有BCMath函数,但它们使用字符串
| 归档时间: |
|
| 查看次数: |
5175 次 |
| 最近记录: |