标题:判断一个字符串是否纯数字,有无更优雅的算法?
只看楼主
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
结帖率:100%
 问题点数:0 回复次数:21 
判断一个字符串是否纯数字,有无更优雅的算法?
遇一个函数,需将传入的字符串参数逐字拆解,判断是否纯十进制数字。
比方说:
"1021"、"238A"、"1314X520"……
最粗鲁的算法,无非For...Endfor循环,逐字判断是否数字。

人活世上,可不能要求那么低!——不能光吃饱了完事,还应有所追求吧。
除了眼前的苟且,我感觉吧,还应远眺一眼远方。
你说是吧?
那么,有没有更优雅一点点、让人眼前一亮、会心一笑的算法?
想了一个,自我感觉挺讨巧的,只可惜无法处理"0023"、"001"这种带前导“0”的情况:
*----------------------------------
* 拆解一个字符串参数,逐字判断是否纯十进制数字?
*----------------------------------
function isAllDigit
lpara lcString
if empty(lcString)
    return .F.
endif
lnLen = len(lcString)-1
lnDigit = val(lcString)
if lnDigit > 10 ^ lnLen
    return .T.
else
    return .F.
endif
*----------------------------------

敢问诸侠,砖我是抛出来了,有无玉可捡?
搜索更多相关主题的帖子: 判断 数字 是否 字符串 算法 
2022-09-27 09:28
厨师王德榜
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册:2013-2-16
得分:0 
我觉得 是不是全数字,不能刻意的理解为这个字串中只能有0~9,比如
'-1006.001' / '+1006.001' 这样的字串,用val()转换后,数值不失真,
这种字串在我看来,仍是"全数字"的,所以 要允许字串中含有 "- + . " 符号.

同时, "+ -" 必须在最左,且不能同时出现 ,
      "." 可以在 最左/最右/中间,但是,必须只能出现一次.
总之,我对字串是不是全数字的判断标准,就是:用val()转换后,数值不失真.
有了上述规则,那么不难猜测,逐字符判断仍是最简单有效的办法.
在这个逐字符基础上想要提效,那就把正则用上.
以上就是我对此问题的理解,欢迎指正.
2022-09-27 10:15
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:0 
以下是引用厨师王德榜在2022-9-27 10:15:17的发言:
"全数字"要允许字串中含有 "- + . " 符号.
同时, "+ -" 必须在最左,且不能同时出现 ,
      "." 可以在 最左/最右/中间,但是,必须只能出现一次.
总之,我对字串是不是全数字的判断标准,就是:用val()转换后,数值不失真.


厨版确实是一只老谋深算的狐狸仙,事情考虑得周全,无一遗漏,小可真心佩服得紧哪!
哦,对了,厨版的鞋面有一点点尘,请让我给您擦一擦,好不好?


是这样的,这函数用途较特殊,判断是否纯数字,仅仅是用于给文件夹或文件命名——
不会有“+ - .”等情况,特别是文件名当中绝不允许出现“.”,扩展名才有“.”。
故而可算是“阉割版”的纯数字判断:只需匹配0--9。只需要找公公,不需要找小鸡鸡。
不过前导“0”的情况,则避无可避,必须精准处理。
2022-09-27 10:34
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:0 
当然,这问题纯属“中学生Basic语言竞赛题”那样无聊的“脑筋急转弯”,无非是希望设计一个偏门古怪算法:

不用循环,判断0--9纯数字

若用循环,那就不好玩啦。
呵呵。

我老人家琢磨了一下,将顶楼代码稍事改造一下,应能办到!
优雅、轻盈;
风流倜傥,玉树临风;
面如冠玉,貌胜潘安。

2022-09-27 10:55
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:0 

开古:

*----------------------------------
* 拆解一个字符串参数,逐字判断是否纯十进制数字?
* Ver 0.2
*----------------------------------
function isAllDigit
lpara lcString
if empty(lcString)
    return .F.
endif
if val("1"+lcString) >= 10 ^ len(lcString)
    return .T.
else
    return .F.
endif
*----------------------------------
2022-09-27 11:18
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
此题吹版之前给过精简方法
if empty(CHRTRAN(lcString,'1234567890',''))
    messagebox(lcString+'是纯数字串')
endif

优雅否?

当然前导0还需另外处理一下下

[此贴子已经被作者于2022-9-27 13:58编辑过]

2022-09-27 13:52
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:0 
以下是引用laowan001在2022-9-27 13:52:26的发言:

此题吹版之前给过精简方法
if empty(CHRTRAN(lcString,'1234567890',''))
    messagebox(lcString+'是纯数字串')
endif


这一个函数可太妙啦!
而且不需考虑数值溢出。
我写的函数,其实有个整型值溢出的问题,须加个on error。
2022-09-27 14:23
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
VFP的字符串功能不弱,如果还有个字符串指针就更强大。
还是按字符来处理
程序代码:
? isAllDigit("1021")
? isAllDigit("238A")
? isAllDigit("1314X520")

FUNCTION isAllDigit(lcString)
    RETURN ALINES(arr,lcString,5,"0","1","2","3","4","5","6","7","8","9")==0
ENDFUNC
2022-09-27 17:15
cssnet
Rank: 4
等 级:业余侠客
威 望:4
帖 子:317
专家分:203
注 册:2013-10-4
得分:0 
以下是引用吹水佬在2022-9-27 17:15:07的发言:

FUNCTION isAllDigit(lcString)
    RETURN ALINES(arr,lcString,5,"0","1","2","3","4","5","6","7","8","9")==0
ENDFUNC


这一个函数也非常巧妙!

不过,用空数组来搞,有些晦涩,乍一看,有些晕
另,不排除空字符串参数,这可能是个小漏洞。

? isAllDigit("")
2022-09-27 17:44
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 9楼 cssnet
没考虑那么多,点到即止。
空串要另当别论,如果空串有另用,就要分别处理;无用就直接返回.f.
2022-09-27 18:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-510150-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.220816 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved