免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: qmhball
打印 上一主题 下一主题

有什么方法判断一个字串中的字符全为数字吗 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-08-30 18:32 |只看该作者

回复 #10 xinglu1983 的帖子

楼上两位说的没错 正则的确可以 不过我总觉得如果能不用的话尽量不用。因为正则的效率不高。
不过,如果没有更好的办法,也只能正则了,呵呵。

论坛徽章:
0
12 [报告]
发表于 2007-08-30 19:39 |只看该作者
2 楼不是说过了吗?

ctype_digit()

建议所有「不看手册」类和「不看回帖」的问题都强制悬赏。

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
13 [报告]
发表于 2007-08-30 22:48 |只看该作者
原帖由 qmhball 于 2007-8-30 18:32 发表
楼上两位说的没错 正则的确可以 不过我总觉得如果能不用的话尽量不用。因为正则的效率不高。
不过,如果没有更好的办法,也只能正则了,呵呵。


看你需要效率到什么地步了:

  1. <?php

  2. // --------------------------------------------------------------------------
  3. // File name   : 文件名称.php
  4. // Description : 文件说明
  5. // Requirement : PHP4/5 ([url]http://www.php.net[/url])
  6. //
  7. // Copyright(C), HonestQiao, 2007, All Rights Reserved.
  8. //
  9. // Author: HonestQiao ([email]honestqiao@hotmail.com[/email])
  10. //
  11. // --------------------------------------------------------------------------
  12. function microtime_float($t=0)
  13. {
  14.     list($usec, $sec) = explode(" ", $t==0?microtime():$t);
  15.     return ((float)$usec + (float)$sec);
  16. }

  17. function test_1(&$number)
  18. {
  19.         $t1=$t2=$t_delay=0.0;
  20.         $t0 = microtime();
  21.         for($i=0;$i<100000;$i++)preg_match('/^\d+$/',$number);
  22.         $t1 = microtime();
  23.         $t_delay = microtime_float($t1)-microtime_float($t0);
  24.         return $t_delay;
  25. }

  26. function test_2(&$number)
  27. {
  28.         $t1=$t2=$t_delay=0.0;
  29.         $t0 = microtime();
  30.         for($i=0;$i<100000;$i++)is_int($number);
  31.         $t1 = microtime();
  32.         $t_delay = microtime_float($t1)-microtime_float($t0);
  33.         return $t_delay;
  34. }


  35. $td = array();
  36. $number = 123;
  37. $type=gettype($number);
  38. for($i=0; $i<10; $i++){
  39.         $td[$i] = test_1(&$number);
  40.         printf("%f\n",$td[$i]);
  41. }
  42. printf("regexp:%s:%f\n\n\n",$type,array_sum($td)/10);
  43. unset($td);
  44. unset($number);

  45. $td = array();
  46. $number = 123;
  47. $type=gettype($number);
  48. for($i=0; $i<10; $i++){
  49.         $td[$i] = test_2(&$number);
  50.         printf("%f\n",$td[$i]);
  51. }
  52. printf("%s:%f\n\n\n",$type,array_sum($td)/10);
  53. unset($td);
  54. unset($number);

  55. $td = array();
  56. $number = "123";
  57. $type=gettype($number);
  58. for($i=0; $i<10; $i++){
  59.         $td[$i] = test_1(&$number);
  60.         printf("%f\n",$td[$i]);
  61. }
  62. printf("regexp:%s:%f\n\n\n",$type,array_sum($td)/10);
  63. unset($td);
  64. unset($number);

  65. $td = array();
  66. $number = "123";
  67. $type=gettype($number);
  68. for($i=0; $i<10; $i++){
  69.         $td[$i] = test_2(&$number);
  70.         printf("%f\n",$td[$i]);
  71. }
  72. printf("%s:%f\n\n\n",$type,array_sum($td)/10);
  73. unset($td);
  74. unset($number);

  75. ?>
  76. ---------- PHP代码调试(CLI) ----------
  77. Content-type: text/html
  78. X-Powered-By: PHP/4.4.0

  79. 0.301302
  80. 0.306375
  81. 0.301272
  82. 0.301433
  83. 0.313819
  84. 0.310652
  85. 0.302300
  86. 0.295267
  87. 0.329107
  88. 0.344550
  89. regexp:integer:0.310608


  90. 0.097716
  91. 0.113663
  92. 0.145151
  93. 0.102788
  94. 0.102264
  95. 0.099768
  96. 0.154630
  97. 0.158320
  98. 0.171499
  99. 0.140598
  100. integer:0.128640


  101. 0.296153
  102. 0.261951
  103. 0.266966
  104. 0.269553
  105. 0.280425
  106. 0.261840
  107. 0.257834
  108. 0.262688
  109. 0.308118
  110. 0.291096
  111. regexp:string:0.275662


  112. 0.129914
  113. 0.149462
  114. 0.129195
  115. 0.119718
  116. 0.126575
  117. 0.119233
  118. 0.132560
  119. 0.122826
  120. 0.122475
  121. 0.120120
  122. string:0.127208



  123. 输出完成 (耗时 8 秒) - 正常终止
复制代码


你可以自己运行一下子。

论坛徽章:
0
14 [报告]
发表于 2007-08-31 09:44 |只看该作者
if (intval($foo) == $foo)
{
// $foo 是整数
}

论坛徽章:
0
15 [报告]
发表于 2007-08-31 10:19 |只看该作者
intval
is_int
is_numeric
$i+0==$i

以上四种判断法全错。

论坛徽章:
0
16 [报告]
发表于 2007-09-01 13:22 |只看该作者

回复 #13 HonestQiao 的帖子

这么详尽,太感谢了实在是!

论坛徽章:
0
17 [报告]
发表于 2007-09-01 20:05 |只看该作者
原帖由 dz902 于 2007-8-31 10:19 发表
intval
is_int
is_numeric
$i+0==$i

以上四种判断法全错。



愿闻其详~~~~

论坛徽章:
0
18 [报告]
发表于 2007-09-01 21:08 |只看该作者
原帖由 mikespook 于 2007-9-1 22:05 发表



愿闻其详~~~~


OK。

首先:intval('100is100') == 100 == '100is100'。错。除非用 ===,但你的回贴用的是 ==。

原帖由 mikespook 于 2007-8-31 11:44 发表
if (intval($foo) == $foo)
{
// $foo 是整数
}



然后:is_int('100') === false。错。

然后:is_numeric('100.100') === true 以及 is_numeric('100e100') === true。错。

最后:'100is100'+0 == '100is100'。错。错误同第一个。

按照 LZ 的要求其实只有 2 楼已经给出了最为直接,最为高效且完全符合 LZ 意愿的答案,但是 LZ 却视而不见,而且还不停地关心其它绕远路的方法的效率,并且说了下面这段话。

原帖由 qmhball 于 2007-8-30 20:32 发表
楼上两位说的没错 正则的确可以 不过我总觉得如果能不用的话尽量不用。因为正则的效率不高。
不过,如果没有更好的办法,也只能正则了,呵呵。


我在 12 楼看到这光景,太为 2 楼的朋友不值了,又把其观点复述了一编,不料 再次被忽略,而且连小乔都忽略了。所以:

我只能用稍微大一点的字再把 2 楼的回帖说一次,这个帖子的标题是:

有什么方法判断一个字串中的字符全为数字

最直接而且效率最高而且完全符合要求的答案是:

ctype_digit() 函数

这个答案最早出现在2 楼

[ 本帖最后由 dz902 于 2007-9-1 23:11 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2007-09-01 22:57 |只看该作者
顶楼上,很久没看到热血的CUER,呵呵

论坛徽章:
0
20 [报告]
发表于 2007-09-01 23:39 |只看该作者
我也顶~~

不过更正一下:如果使用===来判断,会连同判断类型, '100' 和 intvel('100') 将返回false. 而 '100is100' == intvel('100is100') 返回 false 我并没有看出有什么问题. 显然字符串 100is100 并不是整数. '100.100' 会被截取为 100 的整数,显然转化后的值不等于原串,所以,在 ctype 不可用的情况下,凑合一下还是可以的.

楼主显然没有听取意见,去看 ctype 部分的手册.

不过dz902 也不用这么大火气,本来论坛嘛,就是这么个地方. 不光是谈技术,也可能是谈学习方法. 楼主或许还没掌握学习方法,或者没掌握问问题的方法而已~~~那么大的红字,容易吓着别人的~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP